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);
使所有三个变量都相同,尽管我试图阅读具有不同内容的不同行。
我也尝试使用倒带(File *文件),它应与fseek(file,0,SEEK_SET)相同
如何读取我想要阅读的行?
提前谢谢!
答案 0 :(得分: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)
答案 1 :(得分:1)
整个rewind
是一个红色的鲱鱼(故意混淆)。在我看来,唯一的问题是你的主“跳过线”循环是不正确的。请在for..loop中尝试此操作:
for(i = 0; i < n; i++)
由于您要读取行n
,您必须跳过行0..n-1
。你的for-loop太早结束了一行。
答案 2 :(得分:1)
无论您将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%s\n", str0, str1, str2);
return 0;
}
输出:
Test line 1
Test line 1
Test line 2
因此,如果它不适合您,我怀疑输入文件中存在一些损坏;或者文件的前两行是相同的。
此外,rewind(file)
在您的代码中是多余的。