首页 > 解决方案 > C - 读取到 EOF,获取额外的地址和数字(数组)

问题描述

所以,我有一个充满数字的文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

情况是,我不知道这个文件中数字的确切数量,所以我不知道我需要将这个文件信息写入这个数组的数组的确切大小。

我只是给了数组比我需要的大得多的大小,我会向你展示输出,它部分地完成了它的工作。

这是代码:

#include <stdio.h>
#include <stdlib.h>

#define ARR_SIZE 30

int main(void){
FILE *fp;
int array[ARR_SIZE];
fp = fopen("C:/project/project.txt", "r");

printf("Numbers: ");

for(int i = 0; i < ARR_SIZE; i++){
    fscanf(fp, "%d", &array[i]);
}
for(int j = 0; j < ARR_SIZE; j++){
    printf("\n%d", array[j]);
}

fclose(fp);
return 0;
}

我只是想做标准的事情,打开文件,用for循环读取文件,将所有这些信息写入数组并输出数组。

这是我得到的输出,我理解这是因为大小,但你能告诉我如何限制所有这些吗?最简单的方法?

输出:

Numbers:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
4199136
0
4200896
6422240
6422296
6422476
1998244384
592257989
-2
1998220218
1998220461
4200896
6422368
4200987
4200896

我有数组大小 30 和文件 15 中的数字,前 15 是可以的,这正是我需要的,但我不需要它之后的那些数字......

标签: carraysfilelimit

解决方案


您需要从文件中读取的循环的停止条件。一种选择是在您无法扫描项目时停止。使用 from 的返回值fscanf来检测它。

当您进行打印时,仅打印实际扫描的项目数。

尝试

for(int i = 0; i < ARR_SIZE; i++){
    if (fscanf(fp, "%d", &array[i]) != 1) break; // Stop if the scan fails
}
for(int j = 0; j < i; j++){  // ARR_SIZE replaced by i
    printf("\n%d", array[j]);  
}

fp顺便说一句:您应该在文件打开后检查它是否有效。


推荐阅读