【问题标题】:c initializing array from file makes first element -1c从文件初始化数组使第一个元素-1
【发布时间】:2016-11-29 22:12:19
【问题描述】:

我在 ubuntu - 代码块上。 我被困在一个更复杂的文件读取任务中,所以创建了一个最简单的测试,它向我抛出了这个奇怪的“错误”。

为了简单起见,我有 2 个全局变量

int a[20];
int row=20;

从文件初始化数组的函数

void load_file(char* filename) {
int i;
FILE* f;

f=fopen(filename, "r");

for (i=0; i<row; i++)
    fscanf(f, "%d", &a[i]);

fclose(f);
}

另一个将数组保存到(相同)文件的函数

void save_file(char* filename) {
int i;
FILE* f;

f=fopen(filename, "w");

for (i=0; i<row; i++)
    fprintf(f, "%d", a[i]);

fclose(f);
}

因为我真的不知道这可能是什么问题是程序中存在的其他两个函数:

void print_a() {
int i;
for (i=0; i<row; i++)
    printf("%d ", a[i]);
printf("\n");
}

void init_a(int val) {
int i;
for (i=0; i<row; i++)
    a[i]=val;
}

这里是主要的:

int main(){

init_a(2);
print_a();
init_a(5);
save_file("a.txt");
load_file("a.txt");
print_a();


return 0;
}

程序的输出是:

2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
-1 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5

所以“错误”是加载文件后,数组中的第一个元素初始化为-1,而文件中只有20个5s。 我真的不知道,谢谢你的帮助。

【问题讨论】:

  • a.txt 的内容长什么样? %d 后面有没有忘记空格:save_file()
  • fprintf(f, "%d", a[i]); --> fprintf(f, "%d\n", a[i]);
  • 您甚至没有最低限度的错误检查。添加它并提供minimal reproducible example 更多详细信息。请参阅How to Ask 并遵循建议。

标签: c arrays global-variables file-handling


【解决方案1】:

问题是你的a.txt 看起来像这样:

55555555555555555555

所以当您尝试再次阅读时,它确实不是看起来像 20 个整数。它看起来像一个非常大的数字,对于整数来说太大了。

打印到文件时在每个整数之间添加一个空格。像这样:

void save_file(char* filename) {
    int i;
    FILE* f;

    f=fopen(filename, "w");
    // Here you should check that f is valid before proceeding

    for (i=0; i<row; i++)
        fprintf(f, "%d ", a[i]);
              //      ^ notice

    fclose(f);
}

此外,您应该始终检查来自fopen 和fscanf 的返回值

【讨论】:

  • scanf()格式字符串中用于读取的空格不重要;除了%c、%[…](扫描集)和%n之外的所有输入转换都会自动跳过前导空格。没有坏处,但也没有好处。 OTOH,确保写入时值之间的空格(或换行符)至关重要。
  • 并且始终检查fscanf和fopen等重要函数调用的返回值。例如,检查 fscanf 返回值会发现这个问题。
  • @JonathanLeffler - 感谢您提供的信息 - 答案已更新。
  • @kaylum - 是的,我将其添加为最后一条评论。
猜你喜欢
  • 1970-01-01
  • 2015-11-11
  • 2019-10-07
  • 1970-01-01
  • 2013-10-19
  • 1970-01-01
  • 2020-08-26
  • 2011-11-10
相关资源
最近更新 更多