将文本中的数据导入数组

时间:2012-06-05 19:17:31

标签: c scanf

我有作业,从文本文件中取出电话号码,然后把它放到一个数组中...... 这是我写的内容,虽然它没有任何内容...... 循环就是.txt文件中的theres文本,将其读入数组......

void get_phones(int *phones)
{
    FILE *fp;
    fp = fopen("phones.txt", "rt");
    if (fp == NULL)
    {
        printf ("Error\n");
    }
    else
    {
        while (fscanf(fp, "%d\n", &phones) > 0)
        {
            fscanf(fp, "%d\n", &phones);
        }
    } 
}

3 个答案:

答案 0 :(得分:1)

最新更新:
用于测试:
请将以下代码放入main(),并将数字10更改为文件中的行数。要自动计算上限,您可以尝试将get_phones的返回类型更改为int,并将计数器放入while循环中。

int i=0;
for(i=0;i<10;i++){
   printf("%lld\n",*(phones+i));
}

您需要引用指针才能打印实际值。否则,您将打印存储在指针中的地址。phones除了是数组的名称外,还有指向数组中第一个元素的指针它的本质。有关指针和数组的更多信息,请参阅this tutorial

假设您使用的是32位计算机
我在文本文件中输入的电话号码如下:
22121222345
678139199个
111111111个

请注意,22,121,222,345&gt; = 2,147,483,647,这是int可以表示的最大数量。 (对于unsigned int,它是2 ^ 32-1)。现在,如果我们尝试运行以下代码:

void get_phones(int *phones){
    FILE *fp;
    fp = fopen("phones.txt", "rt");

    if (fp == NULL)
        printf ("Error\n");
    else
        while (fscanf(fp, "%d\n", phones++) !=EOF){}

}

终端上打印的号码列表是:
646385865个
678139199个
111111111个

数组中保存的第一个数字是完全随机的!为什么?因为它对于整数而言太大而且会溢出。

现在,如果我们尝试以下版本:

void get_phones(long long* phones){
    FILE *fp;
    fp = fopen("phones.txt", "rt");
        if (fp == NULL)
            printf ("Error\n");
        else
            while (fscanf(fp, "%lld\n", phones++) !=EOF){}

}


终端上打印的号码列表是:
22121222345
678139199个
111111111个

它为什么有效?因为类型long long可以存储最多2 ^ 63-1 = 9,223,372,036,854,775,807的数字

经过测试的工作版本。如果需要,请将数据类型更改为long long

!!您的代码的问题在于您将错误的内容传递给fscanfphones已经是一个指针 - 它指向数组的起始点。当你写phone++时,它将当前指针传递给fscanf,并将指针增加1,这将指针移动到整数数组中的下一个槽。

另外,虽然fscanf将返回其扫描的项目数,但在您的while循环条件下,扫描已经执行。所以你不需要在while循环体中第二次调用它

5195551234遗憾的是,这个号码对于unsigned long来说仍然太大了。因为对于32位计算机,intunsigned long都具有最大值$ 2 ^ {32} -1 $。如果您需要更多相关信息,请查看wikipedia。相反,如果您在32位计算机上运行代码,则需要long long,否则它将溢出并存储不正确的数据。

答案 1 :(得分:0)

  1. 你应该有main()函数来运行make程序(参考文档)
  2. int *phones应指向已分配的内存。
  3. fscanf(fp, "%d\n", &phones); - 此函数的每次调用都会重写先前读取的数字,例如: G。读取后的每个数字都与前一个相同。
  4. 这是循环迭代两次调用fscanf的行为逻辑。 检查第一个fscanf()的结果,但第二个结果不是。

答案 2 :(得分:0)

只是为了添加其他答案,您应该使用long unsigned而不是int(我假设电话号码类似于5195551234 - 这对int来说太大了)。

如果你知道文件中的最大电话号码数,你可以像这样预先为数组分配空间:

long unsigned phones[1024];

在这种情况下,我假设最大数量为1024.如果您不知道最大数量,还可以使用malloc动态分配内存(有关详细信息,请参见手册页)。< / p>

您的函数get_phones可能应该返回您读取的电话号码的数量(这与您的while循环逻辑不正确的事实相关)。