2017-08-29 15 views
1

テキストファイルを1行ずつ移動するとき、次の行を見渡し、現在の行を処理している間にそれを調べることができます。私はC言語で作業しています。私はfseek()または他の同様の機能がこれで私を助けてくれると信じていますが、わかりませんし、それらの使用方法もわかりません。入力ファイルを処理するときに先読みする方法(2行を処理する)

fp = fopen("test-seeking.txt", "r"); 

    while((fgets(line, BUFMAX, fp))) { 
     // Peek over to next line 
     nextline = ...; 
     printf("Current line starts with: %-3.3s/Next line starts with %-3.3s\n", 
       line, nextline); 
    } 

私は何か助けていただきありがとうございます。

+0

'fgetc'と' ungetc'を使うか、次の行だけを読み込みます。 –

+7

1行を読み取った後、1行を読み取り、2深度バッファを使用します。バッファの最初の行は現在の行で、もう1行は次の行です。 –

+0

WINAPIにはPeekシリーズの機能があります。 – iBug

答えて

0

確かにあなたがfseekを使用して、このような何か試すことができます。もう一つの方法は、このように、fgetposfsetposを使用することです

fp = fopen("test-seeking.txt", "r"); 

while ((fgets(line, BUFMAX, fp))) { 
    // Get the next line 
    fgets(nextline, BUFMAX, fp); 

    // Get the length of nextline 
    int nextline_len = strlen(nextline); 

    // Move the file index back to the previous line 
    fseek(fp, -nextline_len, SEEK_CUR); // Notice the - before nextline_len! 

    printf("Current line starts with: %-3.3s/Next line starts with %-3.3s\n", line, nextline); 
} 

を:

fp = fopen("test-seeking.txt", "r"); 

while ((fgets(line, BUFMAX, fp))) { 
    // pos contains the information needed from 
    // the stream's position indicator to restore 
    // the stream to its current position. 
    fpos_t pos; 

    // Get the current position 
    fgetpos(fp, &pos); 

    // Get the next line 
    fgets(nextline, BUFMAX, fp); 

    // Restore the position 
    fsetpos(fp, &pos); 

    printf("Current line starts with: %-3.3s/Next line starts with %-3.3s\n", line, nextline); 
} 
+0

ありがとうございました! –

0

次のコードは、@Jean-François Fabrecommentからインスピレーションを受けています。行を保持するために使用される2D文字配列lineBufferを使用します。最初の読み取り行は、インデックス0 lineBuffer[0]に書き込まれ、2行目はlineBuffer[1]に書き込まれます。その後、文章はtoggle variablelineSelの助けを借りてインデックス0と1の間で交互になります。最後のステップとしてcurLineポインタはnextLineに設定されます。

結果として、curLinenextLineをループ内で使用できます。 あなたがで構成されたファイルがある場合:

line 1 
line 2 
line 3 
... 

をあなたがで動作します:

curLine = "line 1\n" 
nextLine = "line 2\n" 

curLine = "line 2\n" 
nextLine = "line 3\n" 

... 

live example with stdin instead of a file on ideoneを参照してください。

コード:

#include <stdio.h> 

#define BUFMAX  256 
#define CURLINE  0 
#define NEXTLINE  1 
#define TOGGLELINE (CURLINE^NEXTLINE) 

int main() 
{ 
    FILE* fp = fopen("test-seeking.txt", "r"); 

    char lineBuffer[2][BUFMAX]; 
    char* curLine; 
    char* nextLine; 
    int lineSel; 

    if (fp != NULL) 
    { 
     if ((curLine = fgets(lineBuffer[CURLINE], BUFMAX, fp))) 
     { 
     for (lineSel = NEXTLINE; 
       (nextLine = fgets(lineBuffer[lineSel], BUFMAX, fp)); 
       lineSel ^= TOGGLELINE) 
     { 
      printf("Current line: \"%s\"/Next line \"%s\"\n", 
        curLine, nextLine); 

      curLine = nextLine; 
     } 
     } 

     fclose(fp); 
    } 

    return 0; 
} 
+0

私の質問Andreにお返事ありがとうございます!私は解決策として答えを選択しました。 –

関連する問題