c++fwrite 复制文件换行符加0x0d

迷路卡不迷路 2015-01-10 04:45:44
我想把in文件的内容添加到out文件的末尾

如果我打开格式加上了app或ate,复制后内容的二进制文件被改了,碰到0x0A,会自动在前面加上0x0D.大家都是怎么处理的这问题?


ifstream in;
in.open(inpath,ios::binary);
ofstream out;
out.open(outpath,ios::binary||ios:app ate); // ||ios:app ate out 换行符会改变????但不写文件会被清除

in.seekg(0,ios::end);
long long size=in.tellg();
out.seekp(0,ios::end);
char * buf=(char * )malloc(size);//有隐含截断错误

in.seekg(0,ios::beg);
in.read(buf,size);
out.seekp(1,ios::end);
out.write(buf,size);


...全文
355 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
迷路卡不迷路 2015-01-12
  • 打赏
  • 举报
回复
引用 2 楼 q408384053 的回复:
可以读到vector里面,然后在每个0x0a后面插入0x0d
第一次用c++写程序,victor还真不会,我会去学下相关内容。谢谢。 对于我那个问题,我已经解决了。我是先用读方式打开b,读取所有内容到一个char * 中,然后用写方式打开,写回去的。
引用 9 楼 zhao4zhong1 的回复:
乍看起来c++的cin、cout、ifstream、ofstream在输入、输出上比c的scanf、printf、fopen、fgetc、fputc、fread、fwrite、fclose简单,不用格式控制符! 但是不用格式控制符,输入输出恰好是你期望的格式的时候好说;等到输入输出不是你期望的格式的时候,你就会觉得还是用格式控制符更方便、更靠谱。 摒弃cin、cout、ifstream、ofstream! 使用scanf、printf、fopen、fgetc、fputc、fread、fwrite、fclose。
我现在写的代码量还是太少,没有你说的这种体会。 刚好用到一个格式化文本输入输出的需要,在网上搜到的例子大多是用c的fprintf和fscanf,我想用ofstream去做,就不会了。最后猛然想到可以用cin和cout,看起来也很舒服。 c的格式控制符熟练后确实很方便,但是老师,这个“靠谱”应该怎么去理解?
赵4老师 2015-01-12
  • 打赏
  • 举报
回复
乍看起来c++的cin、cout、ifstream、ofstream在输入、输出上比c的scanf、printf、fopen、fgetc、fputc、fread、fwrite、fclose简单,不用格式控制符! 但是不用格式控制符,输入输出恰好是你期望的格式的时候好说;等到输入输出不是你期望的格式的时候,你就会觉得还是用格式控制符更方便、更靠谱。 摒弃cin、cout、ifstream、ofstream! 使用scanf、printf、fopen、fgetc、fputc、fread、fwrite、fclose。
赵4老师 2015-01-12
  • 打赏
  • 举报
回复
“更靠谱”的意思就是你更容易知道它具体都干了些啥。
野男孩 2015-01-11
  • 打赏
  • 举报
回复
打开文件有两种方式,一种是文本方式打开,一种是二进制方式打开。不同的打开方式,会导致不同的行为。 windows上和linux上的行为又不一样。楼主遇到这问题了,正是时候百度一下相关信息学习。
迷路卡不迷路 2015-01-11
  • 打赏
  • 举报
回复
引用 4 楼 zhao4zhong1 的回复:
不要把 fopen("...","...");fscanf,fprintf,fgets,fgetc,fclose //读时把\r\n替换成\n,写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待 和 fopen("...","...b");fseek,fread,fwrite,fgetc,fclose //不作以上替换,遇到\x1a仍继续读;读写的内容当字节看待 弄混了
我用的是ofstream,不知道有没有区别。另外,我是想先读取a文件到char * buf,然后一次write到b文件。这样就不能去判断buf中每个自己的内容了
迷路卡不迷路 2015-01-11
  • 打赏
  • 举报
回复
引用 1 楼 fly_dragon_fly 的回复:
windows就是两个字节的,不用文本用二进制就可以了
我用的就是out.open(outpath,ios::binary);但这样会把文件原有的内容清除掉 out.open(outpath,ios::binary||ios:app ate);这种会出现\n\r问题。
迷路卡不迷路 2015-01-11
  • 打赏
  • 举报
回复
引用 3 楼 coding_hello 的回复:
打开文件有两种方式,一种是文本方式打开,一种是二进制方式打开。不同的打开方式,会导致不同的行为。 windows上和linux上的行为又不一样。楼主遇到这问题了,正是时候百度一下相关信息学习。
我是找过之后才来这发帖的,网上都只提到问题,并没有我说的这种,用的就是二进制打开方式,当时附加其他方式就 不可以。只out.open(outpath,ios::binary);可以。用附加方式就不行||ios:app ate\app\out..不知道为什么 不过我的问题我以用其他方式解决了
赵4老师 2015-01-11
  • 打赏
  • 举报
回复
仅供参考
#include <stdio.h>
FILE *f;
int c1,c2;
int main(int argc,char *argv[]) {
    if (argc!=2) {
        printf("Usage: CR2CRLF filename\n");
        return 1;
    }
    f=fopen(argv[1],"rb+");
    if (NULL==f) {
        printf("Can not open file [%s]!\n",argv[1]);
        return 2;
    }
    while (1) {
        c1=fgetc(f);
        if (EOF==c1) break;
        if ('\r'==c1) {
            c2=fgetc(f);
            if (EOF==c2) {
                fseek(f,-1L,SEEK_CUR);
                fputc('\n',f);
                break;
            }
            if ('\n'!=c2) {
                fseek(f,-2L,SEEK_CUR);
                fputc('\n',f);
                fseek(f,1,SEEK_CUR);
            }
        }
    }
    fclose(f);
    return 0;
}
赵4老师 2015-01-11
  • 打赏
  • 举报
回复
不要把 fopen("...","...");fscanf,fprintf,fgets,fgetc,fclose //读时把\r\n替换成\n,写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待 和 fopen("...","...b");fseek,fread,fwrite,fgetc,fclose //不作以上替换,遇到\x1a仍继续读;读写的内容当字节看待 弄混了
窗外蓝天 2015-01-10
  • 打赏
  • 举报
回复
可以读到vector里面,然后在每个0x0a后面插入0x0d
fly_dragon_fly 2015-01-10
  • 打赏
  • 举报
回复
windows就是两个字节的,不用文本用二进制就可以了

64,649

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧