2009-05-26 82 views
1

我有一个文件,我写,然后改变它的大小,以文字写入它像大小:文件大小c是比大小的数据串的大小不同

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

这看起来不像C.你想要C还是C++? – 2009-05-26 05:26:07

+0

我正在使用从c文件但我需要c + +(我知道fstream,但为mu目的我需要c – sofr 2009-05-26 05:37:46

+0

你改变文件大小的方式是不正确的,你依靠不正确的假设文件大小应该是相同的作为字符串中包含的字符数 – Andrey 2009-05-26 06:17:23

回答

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

开启在二进制(非翻译)模式; 翻译涉及回车 和换行字符 压制。

如果b未在给定模式中, 缺省转换模式由 全局变量_fmode定义。如果tb 以参数为前缀,则 函数失败并返回NULL

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

1

根据您在您的CR/LF和你正在运行的操作系统的代码在做什么,可能会有一些翻译在后台发生的事情,当你读/如果你在文本模式下打开它写入文件。

1

乔纳森击中了头部。

确保您正在以二进制格式读取文件,或者如果您确定该文件仅包含文本(并且这些都是您想要的),则需要准备文件字符为unicode或其他格式。

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

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