S.W.T 发表于 2016-7-3 18:39:59

c++写入文件不能换行

本帖最后由 S.W.T 于 2016-7-4 19:09 编辑

//File Copy.cpp
//功能:复制文件
//软件:C-Free 5.0
//小甲鱼快速入门C++第四课
#include<iostream>
#include<fstream>
using namespace std;
int main(int argc,char* argv[])
{
        //检查调用格式是否正确
        if(argc!=3)
        {
                cerr<<"调用格式:fileCopy.exe sourceFile destFile"<<endl;
                return 0;
        }
       
        //检查文件是否正确打开
        fstream in(argv,ios::in | ios::binary);//以二进制读取文件
        if(!in)
        {
                cerr<<"打开文件失败!"<<endl;
                return 0;
        }
       
        //检查文件是否正确打开
        fstream out(argv,ios::out | ios::binary);//以二进制写入文件
        if(!out)
        {
                cerr<<"打开文件失败!"<<endl;
                in.close();
                return 0;
        }
       
        //应该是错在这里吧
        char ch;
        while(in.peek()!=EOF)
        {
                in>>ch;
                out<<ch;
        }
       
        //关闭文件
        in.close();
        out.close();
        return 0;
}

复制的文本不会少,但会丢失换行符、制表符是怎么回事

例如
源文件:
I love Fishc.com!

I love Fishc.com!    I love Fishc.com!

目标文件:
IloveFishc.com!IloveFishc.com!IloveFishc.com!!.com!!
没有空格,没有回车,最后还多出了一些东西。

冥顽 发表于 2016-7-3 22:30:57

哈和我遇到的那个问题一样

S.W.T 发表于 2016-7-4 19:10:56

冥顽 发表于 2016-7-3 22:30
哈和我遇到的那个问题一样

那你解决了吗

冥顽 发表于 2016-7-4 19:22:50

S.W.T 发表于 2016-7-4 19:10
那你解决了吗

解决了,但不知道原理。。。

冥顽 发表于 2016-7-4 19:23:38

S.W.T 发表于 2016-7-4 19:10
那你解决了吗

http://bbs.fishc.com/forum.php?mod=viewthread&tid=73320&page=1#pid2599902

S.W.T 发表于 2016-7-5 08:08:07

本帖最后由 S.W.T 于 2016-7-5 08:10 编辑

这是我修改后可以用的代码,但还是不知道为什么
//File Copy.cpp
//功能:复制文件
//软件:C-Free 5.0
//小甲鱼快速入门C++第四课

#include<iostream>
#include<fstream>

using namespace std;

int main(int argc,char* argv[])
{
      //检查调用格式是否正确
      if(argc!=3)
      {
                cerr<<"调用格式:fileCopy.exe sourceFile destFile"<<endl;
                return 0;
      }
      
      //检查文件是否正确打开
      fstream in(argv,ios::in | ios::binary);//以二进制读取文件
      if(!in)
      {
                cerr<<"打开文件失败!"<<endl;
                return 0;
      }
      
      //检查文件是否正确打开
      fstream out(argv,ios::out | ios::binary);//以二进制写入文件
      if(!out)
      {
                cerr<<"打开文件失败!"<<endl;
                in.close();
                return 0;
      }
   
       
        //****************核心内容****************   
        in.seekg(0,ios::end);                //原来是 in.seekg(ios::end);
        int filesize = in.tellg();       
        in.seekg(0,ios::beg);                //原来是 in.seekg(ios::beg);
        //上三行是为了 获取文件的大小
       
        char ch;//临时变量
       
        //两个方法,但似乎第二个方法不行
        for(int i = 0; i < filesize; i ++)
        //while(!in.eof())         最后会有乱码
        {       
                in.get(ch);                //原来是:in>>ch;             
                out.put(ch);         //原来是:out<<ch;
        }
      
    //结尾工作
    in.close();
    out.close();
    return 0;
}

S.W.T 发表于 2016-7-5 08:10:38

冥顽 发表于 2016-7-4 19:23
http://bbs.fishc.com/forum.php?mod=viewthread&tid=73320&page=1#pid2599902

这是我修改后可以用的代码,但还是不知道为什么
//File Copy.cpp
//功能:复制文件
//软件:C-Free 5.0
//小甲鱼快速入门C++第四课

#include<iostream>
#include<fstream>

using namespace std;

int main(int argc,char* argv[])
{
      //检查调用格式是否正确
      if(argc!=3)
      {
                cerr<<"调用格式:fileCopy.exe sourceFile destFile"<<endl;
                return 0;
      }
      
      //检查文件是否正确打开
      fstream in(argv,ios::in | ios::binary);//以二进制读取文件
      if(!in)
      {
                cerr<<"打开文件失败!"<<endl;
                return 0;
      }
      
      //检查文件是否正确打开
      fstream out(argv,ios::out | ios::binary);//以二进制写入文件
      if(!out)
      {
                cerr<<"打开文件失败!"<<endl;
                in.close();
                return 0;
      }
   
       
        //****************核心内容****************   
        in.seekg(0,ios::end);                //原来是 in.seekg(ios::end);
        int filesize = in.tellg();       
        in.seekg(0,ios::beg);                //原来是 in.seekg(ios::beg);
        //上三行是为了 获取文件的大小
       
        char ch;//临时变量
       
        //两个方法,但似乎第二个方法不行
        for(int i = 0; i < filesize; i ++)
        //while(!in.eof())         最后会有乱码
        {       
                in.get(ch);                //原来是:in>>ch;             
                out.put(ch);         //原来是:out<<ch;
        }
      
    //结尾工作
    in.close();
    out.close();
    return 0;
}

mingcxx 发表于 2016-7-5 08:36:21

提个建议,windows系统的二进制文件,打开的流会做一些特殊处理,有的特殊符号是用多个字符组合的,比如表示行尾的字符用回车和换行的组合\r\n表示。所以换行符号该特殊处理。没学c++,不知道说的有用没。
页: [1]
查看完整版本: c++写入文件不能换行