我想创建一个函数,它有一个文本文件作为输入,带有一个行号,并返回一个字符串,该字符串代表作为参数给出的行号中的行,用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;
}
2条答案
按热度按时间avkwfej41#
调用
count_number_of_lines
之后,你已经读取了整个文件,所以,当你调用getLineFromFile
时,没有什么可以读的了,因为你已经到了文件的结尾,你需要做的是在每次调用getLineFromFile
时寻找到文件的开头:顺便说一句,两个函数的行数计算不一致。在
count_number_of_lines
中,不计算空行。但是,在getLineFromFile
中,计算空行。即使这样,由于换行符的原因,strlen
实际上对于空行也是正的。因此,您意外地得到了相同的行数。xdyibdwo2#
在函数
main
中,首先调用count_number_of_lines
,然后调用getLineFromFile
。函数
count_number_of_lines
将读取文件,直到到达文件末尾。因此,当您调用getLineFromFile
时,您已经到达文件末尾。因此,getLineFromFile
将无法在文件中找到任何其他数据。为了使函数
getLineFromFile
起作用,您必须倒回到文件的开头,例如通过添加以下行到函数的开头。