返回首页

请参阅下列程序。我从未有处理这个......


int _tmain(int argc, _TCHAR* argv[])

{

	FILE *f,*f2;

	char c[2];

	f=fopen("list.txt","w");

	c[0]=13;

	c[1]=0;

 

	fwrite(&c[0],1,1,f);

	fclose(f);

 

	f2=fopen("list.txt","r");

	while(fread(&c[0],1,1,f2))

	{

		printf("%d",c[0]);

	}

	return 0;

}

{C} 看看上面的代码

我一直搞不清楚这个愚蠢的问题

第一个代码生成1个字节大小的文件。没有问题,
但第二个代码文件创建2个字节
在第二部分,其中文件被打开和读取的所有字符。它只能读取一个字符,但如果我用记事本打开文件,然后意外发生,记事本显示一个字符序列\ R \ N???????

回答

评论会员:理查德MacCutchan 时间:2012/02/06
不要使用外部编辑器(记事本等),以查看数据文件不是纯文本行。让自己不尝试为您解释的内容,而只是显示为一系列字节十六进制浏览器/编辑器:查克・奥图尔:该文件包含一个只有一个字符,你写的FWRITE()

记事本是"帮助"你的裸裸的"新线"(十进制10字符,十六进制0A,也为\ n),并把"回车"字符(十进制13,十六进制0D,又称\ R )在它的前面,使行的可读性。

许多编辑器可以帮助您可视化显示多行的时候,在技术上,它是大长行的文件。经常记事本和写字板会告诉你同一个文件的两个不同的布局。这是由于\ R \ N公约。

要问自己的问题是"你有什么证据,比记事本,该文件是大小为2个字符"

-----------------------------------

好吧,我有一段时间运行在Windows 7与VS2008的代码。我当你的"printf"语句上设置断点while循环内,我那里只有一次,在每一个变化(使用的数据为10或13)。这意味着,FREAD声明只有1个字符,然后的EOF,而不是两个字符,你说的话。
和印刷的价值预期的完全一样。
我也注意到,"文件属性"窗口显示该文件已被2个字节,因为你发现,但只读了一个字符。我在亏损,一个位。

-----------------------------------

我看过理查德的解决方案,决定检查的文件。它说:
取决于环境下的应用程序运行,文本文件的情况下,一些特殊字符转换可能发生在输入/输出操作,使其适应特定系统的文本文件格式。
哪种给它允许添加的东西,你的输出(LF-GT的CRLF)。

当我改变你的应用程序使用"WB"/"RB"为模式,它的工作原理像您期望的那样
评论会员:阿米尔Mahfoozi 时间:2012/02/06
请改变的第二个方案,因为这
第6行:
C [0] = 13;

和测试输出文件。
因为某些程序不承认一个新行0x0A和他们应该只看到字符0x0D