【问题标题】:file size c is different than the size data string's size文件大小 c 与大小数据字符串的大小不同
【发布时间】:2009-05-26 05:22:19
【问题描述】:

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

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()!

【问题讨论】:

  • 这看起来不像 C。你想要 C 还是 C++?
  • 我正在使用 c 中的 teh 文件,但我需要 c++(我知道 fstream,但出于 mu 目的,我需要 c
  • 更改文件大小的方式不正确。您依赖于错误的假设,即文件大小应与字符串中包含的字符数相同。
  • 为什么不正确我认为这就是我想要做的?

标签: c windows file


【解决方案1】:

也许是 CRLF?当心:

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

同样

fopen(filename, "w") 与 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 未在 mode 中给出,则 默认翻译模式定义为 全局变量_fmode。如果 t 或 b 是参数的前缀, 函数失败并返回 NULL。

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

【讨论】:

  • 在我尝试更改文件大小之前一切正常,这是我打开文件=_fsopen(path.c_str(),"r+",_SH_DENYRW) 的方式,但文件长度和文本大小不同? ??
  • 发生的情况是您以“文本模式”打开文件,这意味着文件操作正在尝试翻译为 CRLF。由于这显然是一个 Windows 系统调用,所以当您写入文件时,它会将 LF 转换为 CRLF。
  • rb+ 确实解决了这个问题,但是“r”和“rb”之间的区别是什么,它会影响其他任何东西吗?
  • 二进制模式意味着“读取磁盘上的文件”。这意味着您的数据将在行尾同时包含 CR 和 LF。文本模式(“r”,我相信,“rt”)将读取二进制数据,但将 CR LF 映射到 LF 以标记行尾。另一个区别是文本模式对文件中出现的 control-Z 字符敏感 - 这是一种古老的(如果不是古老的)EOF 指示机制。二进制文件将忽略此类字符 - 它可能会读取超出 EOF 标记的一些字节。
【解决方案2】:

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

【讨论】:

  • 你是什么意思,我应该在代码中改变什么来处理它?
【解决方案3】:

乔纳森一针见血。

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

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

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

【讨论】:

  • 我在这之间做了一些事情,我只写了一个想法
猜你喜欢
  • 2020-10-18
  • 2022-12-17
  • 1970-01-01
  • 1970-01-01
  • 2022-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-24
相关资源
最近更新 更多