我有一个我正在写的文件,然后将其大小更改为写入其中的文本大小:
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()
!
答案 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/O和Unicode Stream I/O in Text and Binary Modes。
答案 1 :(得分:1)
根据您在cr / lf的代码中所执行的操作以及正在运行的操作系统,如果在文本模式下打开文件,则在读取/写入文件时可能会在后台进行一些翻译。
答案 2 :(得分:1)
Jonathan已经击中了头部。
确保您正在以二进制格式读取文件,或者如果您确定该文件仅包含文本(这就是您想要的全部内容),那么请准备好将文件字符设置为unicode或其他格式。
您还会发现额外的控制字符将自动添加,尤其是EOF字符。
我的问题是,为什么你从文件中读取数据,只是再次写回来?