c从文件初始化数组使第一个元素为-1

时间:2016-11-29 22:12:19

标签: c arrays global-variables file-handling

我在使用ubuntu - codeblocks。 我被困在一个更复杂的文件读取任务中,所以创建了最简单的测试,它给我带来了这个奇怪的“错误”。

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

struct Cfg {
   struct Modbus {
      int porta = 0;
      QString ip = QStringLiteral("127.0.0.1");
      int timeout = 1000;
      int retries = 2;
   } modbus;
};

从文件初始化数组的函数

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;
}

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

1 个答案:

答案 0 :(得分: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);
}

除此之外,您应该始终检查fopenfscanf

的返回值