fopen值得注意的有关问题
fopen值得注意的问题
data.txt里面内容
发现data1.txt 比data.txt多了几个字节
前面是二进制打开,后面是用文本方式去写
为啥会在每行多写一个char(13)就是\r的字符
为啥不一样呢
------解决方案--------------------
这涉及到换行符的解释。
文本文件中换行符实际由\n\r两个字符构成。
rb方式读文本文件时,data.txt中的换行符原汁原味读出,得到"\n\r";
wt方式写文本文本时,会将待写字符串中的\n解释成\n\r写入文件,如果字符串中有\n\r,则写成\n\r\r
所以一般读写文件是用匹配方式,即rt对wt、rb对wb
------解决方案--------------------
关于换行问题,在windows下是由换行+回车组成的,但是在linux下却只由一个单换行符。
------解决方案--------------------
还是大神知道的多啊!!学习了
------解决方案--------------------
推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。
不要把
fopen("...","...");fscanf,fprintf,fclose //读时把\r\n替换成\n,写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待
和
fopen("...","...b");fread,fwrite,fclose //不作以上替换,遇到\x1a仍继续读;读写的内容当字节看待
弄混了
#include "stdafx.h"
#include "stdio.h"
#include <iostream>
#include "windows.h"
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
FILE *fp;
fp = fopen("c:\\data.txt", "rb");
if(fp!=NULL)
{
fseek(fp,0,SEEK_END);
int nlen = ftell(fp);
fseek(fp,0,SEEK_SET);
char* p = new char[nlen+1];
fread(p,sizeof(char),nlen,fp);
fclose(fp);
p[nlen]=0;
printf("%s",p);
char c ='\t';
char s =' ';
char r ='\r';
char n ='\n';
FILE* fpw = fopen("c:\\data1.txt","wt");
if (fpw)
{
fwrite(p,sizeof(char),nlen,fpw);
fclose(fpw);
}
system("pause");
}
system("pause");
return 0;
}
data.txt里面内容
aa 12 bb dd 13 14 32
cc dd ff9 10
aa, bbc ddd
dda
aa
发现data1.txt 比data.txt多了几个字节
前面是二进制打开,后面是用文本方式去写
为啥会在每行多写一个char(13)就是\r的字符
为啥不一样呢
------解决方案--------------------
这涉及到换行符的解释。
文本文件中换行符实际由\n\r两个字符构成。
rb方式读文本文件时,data.txt中的换行符原汁原味读出,得到"\n\r";
wt方式写文本文本时,会将待写字符串中的\n解释成\n\r写入文件,如果字符串中有\n\r,则写成\n\r\r
所以一般读写文件是用匹配方式,即rt对wt、rb对wb
------解决方案--------------------
关于换行问题,在windows下是由换行+回车组成的,但是在linux下却只由一个单换行符。
------解决方案--------------------
还是大神知道的多啊!!学习了
------解决方案--------------------
推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。
不要把
fopen("...","...");fscanf,fprintf,fclose //读时把\r\n替换成\n,写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待
和
fopen("...","...b");fread,fwrite,fclose //不作以上替换,遇到\x1a仍继续读;读写的内容当字节看待
弄混了