文件大小c与大小数据字符串的大小不同

时间:2009-05-26 05:22:20

标签: c windows file

我有一个我正在写的文件,然后将其大小更改为写入其中的文本大小:

FILE * file...

我从文件中获取所有数据并将文件大小更改为数据大小,但它有所不同。字符串的大小小于文件长度,它会削减它并丢失数据。 可能是什么问题?

while(fgets(cLine, sizeof(cLine), file) )
    str.append((string)cLine);
fputs(str.c_str(),file);
_chsize( fileno(file), (int)str.size() );

当我选中它时fileLength(fileno(file))总是大于str.size()

3 个答案:

答案 0 :(得分:9)

也许是CRLF?谨防:

fopen(filename, "r") vs fopen(filename, "rb")

同样

fopen(filename, "w") vs fopen(filename, "wb")

原因是因为"r""w"会转换CRLF,而"rb""wb"会将数据视为二进制。在大多数平台上,这被忽略了。例如,fopen man page on OS X

  

模式字符串还可以包含   字母“b”或者作为第三个字母   字符或作为之间的字符   任何一个中的人物   上面描述的双字符串。   这完全是为了兼容性   符合ISO / IEC 9899:1990(“ISO C90”)   并没有效果; “b”是   忽略。

fopen page on MSDN说的不同:

  

<强> B'/强>

     

以二进制(未翻译)模式打开;   涉及回车的翻译   和换行符是   抑制。

     

如果在模式中未给出 t b ,则   默认翻译模式由。定义   全局变量_fmode。如果 t b   在参数前面添加了前缀   函数失败并返回 NULL

     

有关使用文本的详细信息   和Unicode中的二进制模式   多字节流I / O,请参阅Text and Binary Mode File I/OUnicode Stream I/O in Text and Binary Modes

答案 1 :(得分:1)

根据您在cr / lf的代码中所执行的操作以及正在运行的操作系统,如果在文本模式下打开文件,则在读取/写入文件时可能会在后台进行一些翻译。

答案 2 :(得分:1)

Jonathan已经击中了头部。

确保您正在以二进制格式读取文件,或者如果您确定该文件仅包含文本(这就是您想要的全部内容),那么请准备好将文件字符设置为unicode或其他格式。

您还会发现额外的控制字符将自动添加,尤其是EOF字符。

我的问题是,为什么你从文件中读取数据,只是再次写回来?