C语言 使用 fgets() 倒带(文件 * 文件)的读取行不起作用


char *readLine(int n, char * filename) 
{
FILE * file=fopen(filename,"r");
int i=0;
int BUF=255;
char temp[BUF];
char puffer[BUF];
char* returned_string;
for(i = 0; i < n-1; i++)
if(fgets(temp, BUF, file) == NULL)
    return NULL;
if(fgets(puffer,BUF,file) == NULL)
return NULL;
returned_string = malloc (strlen (puffer) + 1);
strcpy (returned_string, puffer);
rewind(file); 
fclose(file);
return returned_string;
}

使用 调用以前的代码:

char * temp=readLine(0,filename);
char * temp2=readLine(1,filename);
char * temp3=readLine(2,filename);

使所有三个变量相同,尽管我正在尝试阅读具有不同内容的不同行。

我还尝试使用倒带(文件 * 文件(,它应该与 fseek(文件,0,SEEK_SET( 相同

如何阅读我想阅读的行?

提前谢谢你!

更新

试试这段代码,它转到第 n 行并返回它(我相信这就是你想要做的(fseek 转到前面的行,fgets 获取后面的行(意味着目标行(:

char *readLine(int n, char * filename) 
{
FILE * file=fopen(filename,"r");
int i=0;
int BUF=255;
char puffer[BUF];
char* returned_string;
fseek(file , n-1 ,SEEK_SET);
if(fgets(puffer,BUF,file) == NULL)
    return NULL;
returned_string = malloc(sizeof(puff));
strcpy (returned_string, puffer);
fclose(file);
return returned_string;
}

在malloc中使用malloc(sizeof(puff)) or malloc(BUFF)因为它要快得多,因为当您使用malloc(strlen(puff) + 1)时,编译器每次都必须计算strlen(puff(

无论您调用n为 0 还是 1 的函数,您都将获得文件中的第一行。如果 n 为 0 或 1,而 i 为 0,则 i 不小于 n - 1 ,因此您的for循环将永远不会执行。

但是,当以 n 作为 2 调用时,该函数应正确返回第二行。它对我有用:

输入文件:

Test line 1
Test line 2
Test line 3
Test line 4
Test line 5

调用:

int main (void) {
    char *str0, *str1, *str2;
    str0 = readLine (0, "test");
    str1 = readLine (1, "test");
    str2 = readLine (2, "test");
    printf ("%s%s%sn", str0, str1, str2);
return 0;
}

输出:

Test line 1
Test line 1
Test line 2

因此,如果它不适合您,我怀疑您的输入文件中存在一些损坏; 或者文件的前两行是相同的。

此外,rewind(file)代码中是多余的。

整个rewind都是红鲱鱼(故意混淆(。在我看来,唯一的问题是您的主要"跳过线"循环不正确。试试这个在 for..循环代替:

for(i = 0; i < n; i++)

由于要读取n 行,因此必须跳过0..n-1行。您的 for 循环过早结束了一行。

最新更新