C 带fgets()的读取行倒带(文件*文件)不工作?

C 带fgets()的读取行倒带(文件*文件)不工作?,c,fgets,C,Fgets,使所有三个变量相同,尽管我试图阅读不同内容的不同行 我还尝试使用倒带(File*File),它应该与fseek(File,0,SEEK_SET)相同 我怎样才能读我想读的句子 提前谢谢你 整个倒带是一种故意的模糊处理。在我看来,唯一的问题是您的主“跳过行”循环不正确。请在for..循环中尝试以下操作: char * temp=readLine(0,filename); char * temp2=readLine(1,filename); char * temp3=readLine(2,filen

使所有三个变量相同,尽管我试图阅读不同内容的不同行

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

我怎样才能读我想读的句子


提前谢谢你

整个<代码>倒带是一种故意的模糊处理。在我看来,唯一的问题是您的主“跳过行”循环不正确。请在for..循环中尝试以下操作:

char * temp=readLine(0,filename);
char * temp2=readLine(1,filename);
char * temp3=readLine(2,filename);
(i=0;i
由于要读取第
n行
,因此必须跳过第
0..n-1行
。您的for循环结束得太早了一行。

整个
倒带
都是故意的模糊处理。在我看来,唯一的问题是您的主“跳过行”循环不正确。请在for..循环中尝试以下操作:

char * temp=readLine(0,filename);
char * temp2=readLine(1,filename);
char * temp3=readLine(2,filename);
(i=0;i
由于要读取第
n行
,因此必须跳过第
0..n-1行
。您的for循环提前结束了一行。

更新

试试这段代码,它转到第n行并返回它(我相信这就是你想要做的)fseek在前一行,fgets得到后面的行(意思是目标行):


在malloc中使用
malloc(sizeof(puff))或malloc(BUFF)
,因为使用
malloc(strlen(puff)+1)
时,编译器必须每次计算strlen(puff)

更新

试试这段代码,它转到第n行并返回它(我相信这就是你想要做的)fseek在前一行,fgets得到后面的行(意思是目标行):


在malloc中使用
malloc(sizeof(puff))或malloc(BUFF)
更快,因为当使用
malloc(strlen(puff)+1)
时,编译器每次都必须计算strlen(puff)

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

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

输入文件:

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;
}
电话:

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%s\n", str0, str1, str2);

return 0;

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


另外,
倒带(文件)
在代码中是多余的。

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

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

输入文件:

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;
}
电话:

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%s\n", str0, str1, str2);

return 0;

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



另外,
倒带(文件)
在代码中是多余的。

文件不是磁带。您正在“倒带”,但如果您下次关闭它,则没有意义。该操作仅对打开的文件有效。但这不是你想要的,是吗?您不想从头开始重新开始读取吗?您发布的
fseek
并不等同于
回放。由于您关闭了
文件*
,因此也不需要它。谢谢您,我更正了fseek。我想重新开始读取文件!我同意倒带在这里没有意义,但无论是否调用倒带(文件),它temp temp2和temp3都具有相同的值。使用调试器,逐行遍历代码。文件不是磁带。您正在“倒带”,但如果您下次关闭它,则没有意义。该操作仅对打开的文件有效。但这不是你想要的,是吗?您不想从头开始重新开始读取吗?您发布的
fseek
并不等同于
回放。由于您关闭了
文件*
,因此也不需要它。谢谢您,我更正了fseek。我想重新开始读取文件!我同意倒带在这里没有意义,但无论是否调用倒带(文件),它temp temp2和temp3都具有相同的值。使用调试器,逐行遍历代码。我尝试了这个方法。char*temp3=readLine(2,文件名);现在返回NULL,但文件中第3行为0\n:我试过这个。char*temp3=readLine(2,文件名);现在返回NULL,但文件中第3行为0\n:Si在重读单行时没有问题。这不是性能问题。我想随时随地调用这个函数来打开文件,看看第20019行写了什么。据我所知,您正在尝试保存最后一个位置,以便在下次调用时从该位置读取文件。因此,您正在尝试编写一个有点像fseek的函数,对吗?也许。我试图编写一个函数,返回文件某一行的内容。无论何时何地我都会调用它。我更新了我的答案,试着看看新代码是否适合您没有问题,但这里有一个提示,下次不要浪费内存空间使用不需要的变量,如BUF,只需使用如下符号常量:
#define BUF 255
我在重新读取单行时没有问题。这不是性能问题。我想随时随地调用这个函数来打开文件,看看第20019行写了什么。据我所知,您正在尝试保存最后一个位置,以便在下次调用时从该位置读取文件。因此,您正在尝试编写一个有点像fseek的函数,对吗?也许。我正在尝试编写一个函数,它将返回特定的内容