我正在制作一个文件阅读器,它从文件中逐行读取整数。问题是不起作用。我想我以错误的方式使用fscanf。有人能帮助我吗?
我已经在其他问题中寻找答案,但我找不到任何可以解释我的代码无效的原因。
int read_from_txt(){
FILE *file;
file = fopen("random_numbers.txt", "r");
//Counting line numbers to allocate exact memory
int i;
unsigned int lines = 0;
unsigned int *num;
char ch;
while(!feof(file)){
ch = fgetc(file);
if (ch == '\n'){
lines++;
}
}
//array size will be lines+1
num = malloc(sizeof(int)*(lines+1));
//storing random_numbers in num vector
for(i=0;i<=lines;i++){
fscanf(file, "%d", &num[i]);
printf("%d", num[i]);
}
fclose(file);
}
txt文件如下:
12
15
32
68
46
...
但是这段代码的输出不断给出“0000000000000000000 ......”
答案 0 :(得分:2)
你忘了“倒回”文件:
fseek(file, 0, SEEK_SET);
您的阅读过程会通过文件两次 - 一次计数行,再一次读取数据。您需要在第二次传递之前返回文件的开头。
请注意,您可以使用realloc
一次性完成此操作:将循环中的数字读入临时int
,并且对于每次成功读取,展开num
通过调用realloc
来一个数组。这将根据需要扩展缓冲区,您无需倒带。
在重新分配到realloc
之前,请务必检查num
的结果,以避免内存泄漏。
答案 1 :(得分:1)
您可以尝试使用标准IO中的 getline
函数,并仅使用一个循环将解析后的数字添加到数组中。请参阅下面的代码。请查看 https://linux.die.net/man/3/getline < / p>&#xA;&#xA;
此外,您可以使用 atoi
或 strtoul
函数将读取行转换为整数。请随时查看 https://linux.die.net/man/3/atoi或 https://linux.die.net/man/3/strtoul < / p>&#xA;&#xA;
下面的代码评估带有数字列表的文件,并将这些数字添加到C整数指针
&#xA;&#xA;< code> #include&lt; stdlib.h&gt;&#xA; #include&lt; stdio.h&gt;&#xA;&#xA; int main(int argc,char ** argv){&#xA; FILE *文件;&#xA;&#xA; file = fopen(“./ file.txt”,“r”);&#xA;&#xA; size_t read;&#xA; char * line = NULL;&#xA; size_t line_len = 0;&#xA;&#xA; size_t buffer_size = 10;&#xA; int * buffer =(int *)malloc(sizeof(int)* buffer_size);&#xA;&#xA; int seek = 0;&#xA; while((read = getline(&amp; line,&amp; line_len,file))!= -1){&#xA; buffer [seek ++] = atoi(line);&#xA;&#xA; if(seek%10 == 0){&#xA; buffer_size + = 10;&#xA; buffer =(int *)realloc(buffer,sizeof(int)* buffer_size);&#xA; }&#XA; }&#XA;&#XA; for(int i = 0; i&lt; seek; i ++){&#xA; printf(“%d \ n”,buffer [i]);&#xA; }&#XA;&#XA;自由(缓冲液);&#XA; fclose(file);&#xA;}&#xA;&#xA;&#xA;
如果您不确定应使用哪种转换功能。您可以在 atoi 和 sscanf
之间的区别-sscanf-or-atoi-to-convert-a-string-to-an-integer“>将字符串转换为整数的sscanf或atoi有什么区别?