C语言 返回作为输入的文件的指定行的函数

wwtsj6pe  于 2022-12-17  发布在  其他
关注(0)|答案(2)|浏览(130)

我想创建一个函数,它有一个文本文件作为输入,带有一个行号,并返回一个字符串,该字符串代表作为参数给出的行号中的行,用C语言编写的。(getLineFromFile)但我认为它改变了我的文件的内容,因为我试着在另一个函数中使用它但它看起来很奇怪(在函数(compiled)中).这些是我的函数getLineFromFile和函数“compiled”的代码,在compiled中,当我运行它时,它给了我奇怪的字符,不代表我的行。你能帮助我吗?我看不出函数getLineFromFile的问题在哪里,我认为函数getNumberOfLines也有问题,我希望她在文件为空时返回0。谢谢

#include <stdlib.h>
#include <string.h>

char* getLineFromFile(FILE *fp, int lineNumber)// si on depasse le nb de lignes, elle renvoie la derniere
{
    char *str;
    int i;
    str = malloc(sizeof(char) * 80);// disons que ca ne depasse pas 80
    for (i = 1 ; i <= lineNumber; i++)
        fgets(str, 80, fp);

    str[strlen(str) - 1] = '\0';

    return str;
}
/// count the number of non empty lines in a file
int count_number_of_lines(FILE *fp) {
    int count = 0;
    char line[256];

    while (fgets(line, sizeof(line), fp) != NULL) {
        if (strlen(line) > 0) {
            count++;
        }
    }

    return count;
}

int compiled(FILE* fp){
   char *line =malloc(sizeof(char)*80);
   int nb_lines=count_number_of_lines(fp);
   printf("number of lines : %d \n", nb_lines);
   for (int j=1;j<=nb_lines;j++){
     line=getLineFromFile(fp,j);
     printf("%s \n",line);
   }
   return 0;
}


int main()
{
    FILE *fichier=fopen("CodeSource.txt","r");
    char *str=malloc(sizeof(char)*80);
    int nb_lines=count_number_of_lines(fichier);
    for (int j=1;j<=nb_lines;j++){
        str=getLineFromFile(fichier,j);
        printf("%s \n",str);
    }
free(str);
    return 0;
}
avkwfej4

avkwfej41#

调用count_number_of_lines之后,你已经读取了整个文件,所以,当你调用getLineFromFile时,没有什么可以读的了,因为你已经到了文件的结尾,你需要做的是在每次调用getLineFromFile时寻找到文件的开头:

char* getLineFromFile(FILE *fp, int lineNumber)
{
    fseek(fp, 0, SEEK_SET);
    ...
}

顺便说一句,两个函数的行数计算不一致。在count_number_of_lines中,不计算空行。但是,在getLineFromFile中,计算空行。即使这样,由于换行符的原因,strlen实际上对于空行也是正的。因此,您意外地得到了相同的行数。

xdyibdwo

xdyibdwo2#

在函数main中,首先调用count_number_of_lines,然后调用getLineFromFile
函数count_number_of_lines将读取文件,直到到达文件末尾。因此,当您调用getLineFromFile时,您已经到达文件末尾。因此,getLineFromFile将无法在文件中找到任何其他数据。
为了使函数getLineFromFile起作用,您必须倒回到文件的开头,例如通过添加以下行

rewind( fp );

到函数的开头。

相关问题