在C中从txt文件读取整数

在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

我正在制作一个文件阅读器,可以从文件中逐行读取整数。问题是它不起作用。我想我用错了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);
}
但此代码的输出始终显示“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