0

我有作业,从文本文件中获取电话号码,并将其放入数组中......这是我写的,虽然它没有放在上面......只要有文本在循环就是.txt 文件,将其读入数组...

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

3 回答 3

1

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

如果您知道文件中电话号码的最大数量,则可以为数组预先分配空间,如下所示:

long unsigned phones[1024];

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

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

于 2012-06-05T19:35:24.583 回答
1

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

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

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

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

请注意,22,121,222,345>=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如果需要,将数据类型更改为。

!!您的代码的问题是您将错误的内容传递给fscanf. phones已经是一个指针——它指向数组的起点。当您写入时phone++,它会将当前指针传递给 fscanf,并将指针加一,这会将指针移动到整数数组中的下一个槽。

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

不幸的是, 5195551234 这个数字仍然太大了unsigned long。因为对于 32 位机器,两者int都有unsigned long最大值 $2^{32}-1$。如果您需要有关此的更多信息,请查看维基百科。相反,long long如果您在 32 位机器上运行代码,则需要,否则它将溢出并存储不正确的数据。

于 2012-06-05T19:55:15.410 回答
0
  1. 您应该具有main()运行 make 程序的功能(请参阅文档)
  2. int *phones应该指向分配的内存。
  3. fscanf(fp, "%d\n", &phones);-- 每次调用此函数都会重写之前读取的数字,例如,读取后的每个数字都放在与前一个相同的内存地址。
  4. 在循环迭代中调用 fscanf 两次是不正确的行为逻辑。检查第一个 fscanf() 的结果,但不检查第二个的结果。
于 2012-06-05T19:24:07.810 回答