0
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(file,0,SEEK_SET) 相同的 rewind(File * file)

如何阅读我想阅读的行?

先感谢您!

4

3 回答 3

2

更新

试试这个代码,而不是它转到第 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)

于 2013-08-15T17:45:40.093 回答
1

整个rewind是一条红鲱鱼(故意混淆)。在我看来,唯一的问题是您的主要“跳线”循环不正确。在 for..loop 中试试这个:

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

既然要n,就必须跳过0..n-1。您的 for 循环过早结束了一行。

于 2013-08-15T17:45:29.763 回答
1

无论您使用n0 还是 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%s\n", str0, str1, str2);

return 0;

}

输出:

Test line 1
Test line 1
Test line 2

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

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

于 2013-08-15T18:10:34.200 回答