在C中从txt文件读取整数
我正在制作一个文件阅读器,可以从文件中逐行读取整数。问题是它不起作用。我想我用错了fscanf。有人能帮我吗 我已经在其他问题中寻找了答案,但我找不到任何解释为什么我的代码不起作用的东西在C中从txt文件读取整数,c,file,C,File,我正在制作一个文件阅读器,可以从文件中逐行读取整数。问题是它不起作用。我想我用错了fscanf。有人能帮我吗 我已经在其他问题中寻找了答案,但我找不到任何解释为什么我的代码不起作用的东西 int read_from_txt(){ FILE *file; file = fopen("random_numbers.txt", "r"); //Counting line numbers to allocate exact memory int i; unsign
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);
}
但此代码的输出始终显示“0000000000000…”您忘记了“倒带”文件:
fseek(file, 0, SEEK_SET);
您的读取过程将在文件中执行两次—一次是计数行,另一次是读取数据。在第二遍之前,您需要返回到文件的开头
注意,您可以在一次过程中使用realloc
:将循环中的数字读入临时int
,对于每次成功的读取,通过调用realloc
将num
数组逐个展开。这将根据需要扩展缓冲区,而不需要倒带
在重新分配到num
之前,请仔细检查realloc
的结果,以避免内存泄漏。您忘记了“倒带”文件:
fseek(file, 0, SEEK_SET);
您的读取过程将在文件中执行两次—一次是计数行,另一次是读取数据。在第二遍之前,您需要返回到文件的开头
注意,您可以在一次过程中使用realloc
:将循环中的数字读入临时int
,对于每次成功的读取,通过调用realloc
将num
数组逐个展开。这将根据需要扩展缓冲区,而不需要倒带
在重新分配到
num
之前,请仔细检查realloc
的结果,以避免内存泄漏。您可以尝试使用标准IO中的getline
函数,并仅使用一个循环将解析后的数字添加到数组中。请参阅下面的代码。请查收
此外,您还可以使用atoi
或strtoul
函数将读取行转换为整数。请随时检查或确认
下面的代码使用数字列表计算文件,并将这些数字添加到C整数指针
#include <stdlib.h>
#include <stdio.h>
int main(int argc, char ** argv) {
FILE * file;
file = fopen("./file.txt", "r");
size_t read;
char * line = NULL;
size_t line_len = 0;
size_t buffer_size = 10;
int * buffer = (int *)malloc(sizeof(int) * buffer_size);
int seek = 0;
while((read = getline(&line, &line_len, file)) != -1) {
buffer[seek++] = atoi(line);
if (seek % 10 == 0) {
buffer_size += 10;
buffer = (int *)realloc(buffer, sizeof(int) * buffer_size);
}
}
for (int i = 0; i < seek; i++) {
printf("%d\n", buffer[i]);
}
free(buffer);
fclose(file);
}
#包括
#包括
int main(int argc,字符**argv){
文件*文件;
file=fopen(“./file.txt”,“r”);
尺寸不可读取;
char*line=NULL;
尺寸线长度=0;
大小缓冲区大小=10;
int*缓冲区=(int*)malloc(sizeof(int)*缓冲区大小);
int seek=0;
while((read=getline(&line,&line_len,file))!=-1){
缓冲区[seek++]=atoi(行);
如果(搜索%10==0){
缓冲区大小+=10;
buffer=(int*)realloc(buffer,sizeof(int)*buffer\u size);
}
}
for(int i=0;i
如果您不确定应该使用哪个转换函数。您可以在处检查
atoi
和sscanf
之间的差异。您可以尝试使用标准IO中的getline
函数,并仅使用一个循环将解析的数字添加到数组中。请参阅下面的代码。请查收
此外,您还可以使用atoi
或strtoul
函数将读取行转换为整数。请随时检查或确认
下面的代码使用数字列表计算文件,并将这些数字添加到C整数指针
#include <stdlib.h>
#include <stdio.h>
int main(int argc, char ** argv) {
FILE * file;
file = fopen("./file.txt", "r");
size_t read;
char * line = NULL;
size_t line_len = 0;
size_t buffer_size = 10;
int * buffer = (int *)malloc(sizeof(int) * buffer_size);
int seek = 0;
while((read = getline(&line, &line_len, file)) != -1) {
buffer[seek++] = atoi(line);
if (seek % 10 == 0) {
buffer_size += 10;
buffer = (int *)realloc(buffer, sizeof(int) * buffer_size);
}
}
for (int i = 0; i < seek; i++) {
printf("%d\n", buffer[i]);
}
free(buffer);
fclose(file);
}
#包括
#包括
int main(int argc,字符**argv){
文件*文件;
file=fopen(“./file.txt”,“r”);
尺寸不可读取;
char*line=NULL;
尺寸线长度=0;
大小缓冲区大小=10;
int*缓冲区=(int*)malloc(sizeof(int)*缓冲区大小);
int seek=0;
while((read=getline(&line,&line_len,file))!=-1){
缓冲区[seek++]=atoi(行);
如果(搜索%10==0){
缓冲区大小+=10;
buffer=(int*)realloc(buffer,sizeof(int)*buffer\u size);
}
}
for(int i=0;i
如果您不确定应该使用哪个转换函数。您可以在
fgetc
循环后检查atoi
和sscanf
at之间的差异,文件指针位于文件末尾。在再次阅读之前,您需要将文件倒带。@Lashane文件
以文本模式打开。与编译器对文本文件的C库理解相对应的文本文件将\n
、\r\n
或\r
转换为'\n'
<代码>如果(ch='\n')足够。如果需要处理其他文本文件,则会出现许多超出本文范围的其他问题。提示:任何时候代码行为不符合预期,并且代码正在执行I/O,请添加代码以检查I/O函数的返回值,如fscanf(文件,“%d”、&num[I])
这会显示出问题-这可以节省您的时间。让我们。而(!feof(file))
fgetc
返回一个int
而不是char
。在fgetc
循环之后,文件指针位于文件的末尾。在再次阅读之前,您需要将文件倒带。@Lashane文件
以文本模式打开。与编译器对文本文件的C库理解相对应的文本文件将\n
、\r\n
或\r
转换为'\n'
<代码>如果(ch='\n')足够。如果需要处理其他文本文件,则会出现许多超出本文范围的其他问题。提示:任何时候代码行为不符合预期,并且代码正在执行I/O,请添加代码以检查I/O函数的返回值,如fscanf(文件,“%d”、&num[I])
这会显示出问题-这可以节省您的时间。让我们。而(!feof(file))
fgetc
返回一个int
而不是char