【问题标题】:I cannot read more than a 49 structs array from a file我不能从文件中读取超过 49 个结构数组
【发布时间】:2014-09-29 18:15:23
【问题描述】:

我有这个代码。当我编译并执行它时,没有显示错误,但是,从第 50 个元素到最后一个元素,值超出了 rand() 的区间(我认为,从 0 到 32767)。这是非常出乎意料的,因为程序继续运行而没有显示任何写入错误消息。

#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#define MAX 100

using namespace std;

struct num {
    int val;
};

int main() {
    FILE *f, *g;
    num data[MAX];

    f = fopen("file1.txt", "w");
    if(f == NULL) {
        printf("Error\n");
        exit(0);
    } else {
        for(int i = 0; i < MAX; i++) {
            data[i].val = rand();
        }
        fwrite(data, sizeof(num), MAX, f);
        if(ferror(f)) {
            exit(0);
        }
        fclose(f);
    }

    num data1[MAX];
    g = fopen("file1.txt", "r");

    if(g == NULL) {
        exit(0);
    } else {
        fread(data1, sizeof(num), MAX, g);
        if(ferror(g)) {
            printf("Error\n");
            exit(0);
        }
        fclose(g);

        for(int i = 0; i < MAX; i++) {
            printf("val %d : %d\n", i+1, data1[i].val );
        }
    }
}

【问题讨论】:

  • rand的范围是0RAND_MAX,可能是也可能不是32767。你应该检查它是什么。
  • 您似乎在这里使用了混合 C/C++ 方案,我建议您选择一个并坚持使用它。另外,当您打印出RAND_MAX 时会发生什么?它并不总是 32767,因此您的代码可能完全按照指定的方式执行。
  • 这个程序应该如何给出写错误信息?
  • “我认为是从 0 到 32767” - 它肯定是零到某事std::cout &lt;&lt; RAND_MAX &lt;&lt; '\n'; 在您的程序开始时将消除您可能隐藏的任何不确定性。更好的问题是,如果您正在寻找从 something-to-something-else 的均匀随机分布,为什么不使用 &lt;random&gt; 及其所有美味,尤其是 @987654322 @。为什么这被标记为 [c] ?它显然有 C++ 工件。
  • 我运行了你的代码,输出看起来没什么奇怪的,除了它总是一样的。您需要播种 rand(),最常见的方法是包含 time.h 并调用 srand( time(0) ) 作为 main 的第一行。

标签: c arrays file struct


【解决方案1】:

我认为文件打开模式有问题,您选择了依赖于系统的text 模式,将其更改为binary 模式,一切都会按预期工作。

文本模式取决于应用程序运行的环境,在不同的输入/输出中可能会发生一些特殊字符转换文本根据系统特定的文本。虽然在相同的环境中,二进制文件模式不会发生转换。 二进制模式无需任何转换即可保存和读取数据。

【讨论】:

    【解决方案2】:

    您的代码没有问题。

    main 的末尾添加以下内容以检查任何不匹配的值。

    for (int i = 0; i < MAX; ++i )
    {
       if ( data[i].val != data1[i].val )
       {
          printf("The %d-th value does not match after reading from file.\n", i);
       }
    }
    

    【讨论】:

    • 我运行了我的代码,从第 49 个值开始,我得到了不匹配的值。
    • @JafethDíaz,我在我的机器上看不到这种行为。您可以尝试使用二进制模式"wb""rb" 打开文件。也许这会有所作为。
    • 这就是我所做的,没有任何问题。我一直在阅读有关打开/写入文件的二进制模式和文本模式之间的差异。我知道,当通过文本模式访问文件时,会涉及字符转换(可能因环境而异),而在使用二进制模式时完全不会发生这种情况。字符转换如何影响我的代码尝试编写的内容?
    • @JafethDíaz,这是我不知道如何解释的平台特定行为。
    猜你喜欢
    • 1970-01-01
    • 2013-12-14
    • 2015-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-13
    • 2012-12-25
    • 1970-01-01
    相关资源
    最近更新 更多