【问题标题】:C fwrite and file sizeC fwrite 和文件大小
【发布时间】:2013-12-06 01:28:21
【问题描述】:

我对一个奇怪的问题感到困惑。当我制作如下内容时:

FILE* fl;
int* d = new int[3];
d[0] = -3;
d[1] = -3;
d[2] = -3;

plik = fopen("E:\data.txt","r+b");
fwrite((char*)d, sizeof(int), sizeof(int)*3, fl);
fclose(fl);
system("pause");

它将一些数据正确写入文件,我可以在记事本中清理并获得 0B 文件大小。但是,如果我将 -3 更改为 -2:

FILE* fl;
int* d = new int[3];
d[0] = -2;
d[1] = -2;
d[2] = -2;

plik = fopen("E:\data.txt","r+b");
fwrite((char*)d, sizeof(int), sizeof(int)*3,fl);
fclose(fl);
system("pause");

结果是,当我在记事本中清理数据并保存文件时,它总是2B,并且无法清理到最后。问题是什么?。提前致谢。

【问题讨论】:

  • 注意fwritefclose 等不是 C++,而是 C。相应地编辑了您的问题。
  • 将路径更改为"E:\\data.txt"。否则,您可能无法打开正确的文件进行写入。
  • @Qntm new[] 运算符是 C++,而不是 C。

标签: c file fopen fwrite


【解决方案1】:

您正在将二进制数据写入文件,然后使用文本编辑器打开它。结果是未定义的。当您在文档中看到“未定义”一词时,请注意。不做那样的事情是你的责任。文本编辑器用于打开文本文件,即字符串。将 int 写入文本文件的方法是:

char str[BIGNUMBER];
sprintf(str, "%d", d[0]);
fwrite...

这可能不是您想要的,但它是获得与记事本兼容的文本文件的唯一方法。您可能想要做的是找到一个可以打开、显示和编辑二进制文件的二进制文件编辑器。我个人只是使​​用带有 -b 选项的 vim,即使在 Windows 上也是如此。

【讨论】:

  • 这段代码对我没有任何用处,只是在执行我的项目时遇到了它,我花了 2 个小时来处理问题所在,然后我很好奇原因。但我认为你是对的,谢谢大家的帮助。
  • 不知道你为什么说它是“未定义的”?文件中的字节是已知的 - 并且可能是特定编辑器在遇到此类字节时的行为。很可能它们无法转换为可见字符 - 但这是不同的。你指的是什么文档?尽管我不同意你所说的一些观点,但我还是赞成普遍确定根本原因。
  • @Floris,是的,文件中的字节是已知的,它们不遵循“文本”文件的规范。因此,使用一些随机文本编辑器打开文件(预期加载文本文件)的结果是未定义的。尝试一个实验。复制 PDF 文件并将名称更改为 something.doc。然后将其加载到文字处理器中。你能在屏幕上看到文件吗?
  • 啊 - 关键是“使用一些随机文本编辑器”。对于特定的编辑器,可以知道行为,但对于“任何”(出于您指出的原因)而言,行为是未知的。我不需要做你建议的实验——我知道你的意思。
【解决方案2】:

记事本显然将您正在编写的数据与unicode byte order mark 混淆,并进入一些有趣的状态。

考虑您正在编写的数据在二进制中的外观以及它可能对文本编辑器做什么。

【讨论】:

    【解决方案3】:

    当您打开文件时,您将其分配给变量名 plik

    plik = fopen("E:\data.txt","r+b");
    

    但是您写入未初始化的变量 fl。

    fwrite((char*)d, sizeof(int), sizeof(int)*3,fl);
    

    并且写入的大小不应与 sizeof(int) 相乘。

    fwrite((char*)d, sizeof(int), 3,fl);
    

    【讨论】:

    • fl 在我的代码中被称为plik,我在这里编辑和粘贴时出错,这不是问题。我将"E:\data.txt"" 更改为"E:\\data.txt",但没有帮助。通常问题出在-2 号码上,当我在下面的代码中插入任何其他内容时,一切都很好:FILE* plik; int d=-2; int* a=&d; plik=fopen("E:\\data.txt","r+b"); fwrite((char*)a,sizeof(int),sizeof(int),plik); fclose(plik)
    猜你喜欢
    • 1970-01-01
    • 2011-05-20
    • 1970-01-01
    • 2020-11-01
    • 1970-01-01
    • 2012-05-20
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多