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);

異なる内容の異なる行を読み込もうとしていますが、3 つの変数はすべて同じになります。

また、 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 では、コンパイラを使用するときに毎回 strlen(puff) を計算する必要があるmalloc(sizeof(puff)) or malloc(BUFF)ため、はるかに高速です。malloc(strlen(puff) + 1)

于 2013-08-15T17:45:40.093 に答える
1

as 0 または 1 のどちらで関数を呼び出してもn、ファイルの最初の行が取得されます。nが 0 または 1 で 0iの場合、iは 未満ではないn - 1ため、forループは実行されません。

ただし、n を 2 として呼び出すと、関数は 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

したがって、うまくいかない場合は、入力ファイルが破損している可能性があります。または、ファイルの最初の 2 行が同じです。

また、rewind(file)あなたのコードでは冗長です。

于 2013-08-15T18:10:34.200 に答える
1

全体rewindがニシンです (意図的な難読化)。唯一の問題は、メインの「スキップライン」ループが正しくないことです。代わりに for..loop でこれを試してください:

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

行を読みたいので、行nスキップ0..n-1する必要があります。for ループが 1 行早く終了しました。

于 2013-08-15T17:45:29.763 に答える