我有作业,从文本文件中取出电话号码,然后把它放到一个数组中...... 这是我写的内容,虽然它没有任何内容...... 循环就是.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);
}
}
}
答案 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
。
!!您的代码的问题在于您将错误的内容传递给fscanf
。 phones
已经是一个指针 - 它指向数组的起始点。当你写phone++
时,它将当前指针传递给fscanf,并将指针增加1,这将指针移动到整数数组中的下一个槽。
另外,虽然fscanf
将返回其扫描的项目数,但在您的while循环条件下,扫描已经执行。所以你不需要在while循环体中第二次调用它
5195551234遗憾的是,这个号码对于unsigned long
来说仍然太大了。因为对于32位计算机,int
和unsigned long
都具有最大值$ 2 ^ {32} -1 $。如果您需要更多相关信息,请查看wikipedia。相反,如果您在32位计算机上运行代码,则需要long long
,否则它将溢出并存储不正确的数据。
答案 1 :(得分:0)
main()
函数来运行make程序(参考文档)int *phones
应指向已分配的内存。fscanf(fp, "%d\n", &phones);
- 此函数的每次调用都会重写先前读取的数字,例如: G。读取后的每个数字都与前一个相同。答案 2 :(得分:0)
只是为了添加其他答案,您应该使用long unsigned
而不是int
(我假设电话号码类似于5195551234 - 这对int
来说太大了)。
如果你知道文件中的最大电话号码数,你可以像这样预先为数组分配空间:
long unsigned phones[1024];
在这种情况下,我假设最大数量为1024.如果您不知道最大数量,还可以使用malloc
动态分配内存(有关详细信息,请参见手册页)。< / p>
您的函数get_phones
可能应该返回您读取的电话号码的数量(这与您的while循环逻辑不正确的事实相关)。