将文本文件中的数字读入C中的数组

我是编程菜鸟所以请耐心等待。

我正在尝试将文本文件中的数字读入数组。 文本文件“somenumbers.txt”只包含16个数字,如“5623125698541159”。

#include  main() { FILE *myFile; myFile = fopen("somenumbers.txt", "r"); //read file into array int numberArray[16]; int i; for (i = 0; i < 16; i++) { fscanf(myFile, "%d", &numberArray[i]); } for (i = 0; i < 16; i++) { printf("Number is: %d\n\n", numberArray[i]); } } 

该计划不起作用。 它编译但输出:

编号是:-104204697

数字是:0

编号是:4200704

编号是:2686672

编号是:2686728

编号是:2686916

编号是:2004716757

编号是:1321049414

数字是:-2

编号是:2004619618

编号是:2004966340

编号是:4200704

编号是:2686868

编号是:4200798

编号是:4200704

编号是:8727656

进程返回20(0x14)执行时间:0.118秒按任意键继续。

改成

 fscanf(myFile, "%1d", &numberArray[i]); 

5623125698541159被视为单个数字(在大多数体系结构中超出int范围)。 您需要在文件中写入数字

 5 6 2 3 1 2 5 6 9 8 5 4 1 1 5 9 

16个数字。

如果您的文件有输入

 5,6,2,3,1,2,5,6,9,8,5,4,1,1,5,9 

然后将fscanf %d说明符更改为%d, .

  fscanf(myFile, "%d,", &numberArray[i] ); 

经过一些修改后,这是您的完整代码:

 #include  #include  int main(){ FILE *myFile; myFile = fopen("somenumbers.txt", "r"); //read file into array int numberArray[16]; int i; if (myFile == NULL){ printf("Error Reading File\n"); exit (0); } for (i = 0; i < 16; i++){ fscanf(myFile, "%d,", &numberArray[i] ); } for (i = 0; i < 16; i++){ printf("Number is: %d\n\n", numberArray[i]); } fclose(myFile); return 0; } 
 for (i = 0; i < 16; i++) { fscanf(myFile, "%d", &numberArray[i]); } 

这是试图将整个字符串"5623125698541159"读入&numArray[0] 。 您需要在数字之间留出空格:

 5 6 2 3 ... 

使用%c循环以逐字符而不是%d读取流。

您的代码中存在两个问题:

  • 必须检查scanf的返回值
  • %d转换不考虑溢出(盲目地为每个连续的数字字符应用*10 + newdigit

你得到的第一个值( -104204697 )等于5623125698541159 modulo 2^32 ; 因此它是溢出的结果(如果int 64位宽,则不会发生溢出)。 接下来的值是未初始化的(来自堆栈的垃圾),因此是不可预测的。

您需要的代码可能是(类似于上面BLUEPIXY的答案,图示如何检查scanf的返回值,成功匹配的项目数):

 #include  int main(int argc, char *argv[]) { int i, j; short unsigned digitArray[16]; i = 0; while ( i != sizeof(digitArray) / sizeof(digitArray[0]) && 1 == scanf("%1hu", digitArray + i) ) { i++; } for (j = 0; j != i; j++) { printf("%hu\n", digitArray[j]); } return 0; }