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

时间:2013-12-04 14:50:04

标签: c arrays file scanf

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

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

#include <stdio.h>
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秒 按任意键继续。

6 个答案:

答案 0 :(得分:27)

更改为

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

答案 1 :(得分:12)

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 

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

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

经过一些修改,以下是完整的代码:

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

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

答案 2 :(得分:3)

for (i = 0; i < 16; i++)
{
    fscanf(myFile, "%d", &numberArray[i]);
}

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

5 6 2 3 ...

答案 3 :(得分:2)

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

答案 4 :(得分:1)

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

  • 必须确认{/ 1}} 的返回值
  • scanf转换不会考虑溢出(盲目地为每个连续的数字字符应用%d

您获得的第一个值(*10 + newdigit)等于-104204697 modulo 5623125698541159;因此它是溢出的结果(如果2^32,其中64位宽,不会发生溢出)。接下来的值是未初始化的(来自堆栈的垃圾),因而无法预测。

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

scanf

答案 5 :(得分:-1)

像这样输入您的文件输入 前任: 12 13 22 45 (在每个数字按回车后) 然后运行你的程序它会正常运行