最新更新:
为了测试:
请将以下代码放入您的文件中main()
,并将数字 10 更改为文件中的行数。要自动计算上限,您可以尝试更改 to 的返回类型get_phones
并int
在 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 位机器上运行代码,则需要,否则它将溢出并存储不正确的数据。