2012-03-24 17 views
0

./sample < input.txtコマンドでファイルから読み込みたいが、EOFで停止しない。
私はそれがEOFであることを確認するためにCtrl + Cを押す必要があります。
どうすれば複数の行を読むことができますか?
私はそれをctrl + cなしでEOFを決定できるメインループに入れる必要があります。 私が計画したように、2つのループが必要です: メインループ:ファイルから他の行を取得するには、新しいノードを挿入して "EOF"にする必要があります。 サブループ:文字配列を文字で埋めるには、条件は "\ n"でなければなりません。リンクされたファイルの入力、EOFで停止しない

#include <stdio.h> 
#include <stdlib.h> 

#define SIZE 80 


struct node { 
    char str[SIZE]; 
    struct node* next; 
}; 

void read_line(struct node* line_list); 

int main(void) 
{ 

    struct node* line_list = NULL; // linked list - headp 

    read_line(line_list); 

    return 0; 
} 

void read_line(struct node* line_list) 
{ 
    int ch, i = 0; 

    struct node* temp = malloc(sizeof(struct node)); 
    if(temp!=NULL) { 
     while((ch = getchar()) != EOF){ 
     if (ch != '\n') 
     { 
      temp->str[i] = '\0'; 
      //insert(&line_list,temp.str); 
      break; 
     } 
     if (i < SIZE) 
      temp->str[i++] = ch; 
     printf("New str: %s\n",temp->str); 
     } 
    } 
} 
+1

でコードを書くのか? – Gangadhar

+0

実際には、私はデバッグ方法がわかりません:(私はcygwinで作業していますが、デバッグしようとしている場合は – user1289547

+0

@ user1289547入力ファイルの最初の文字は改行ではありませんか?サンプル入力ファイルの内容。 –

答えて

1

EDIT

は私のオリジナルのポストを無視し、私は金曜日の夜に右考えておりません。あなたのwhileループテストには、Peterが指摘したように別の問題がありました。ただし、mallocの後には、temp != NULLを確認する必要があります。

+0

ながら、(CH!= EOF){ \tしばらく((CH = getchar関数() !)= '\ n'){ \t \t IF(iは<サイズ)を \t \t temp-> STR [I ++] = CH; \t} \t \t temp-> str [i] = '\ 0'; \t printf( "New str:%s \ n"、temp-> str);} 問題はメインループが必要です。同じ条件で両方を書き込むと、1文字列しか生成できません。 – user1289547

+0

@ user1289547 "メインループ"の意味を理解できないようです。問題の内容を説明するために質問を編集してください。いずれにせよ、論理ANDを使って改行と 'EOF'の両方をテストするのは意味がありません。また、あなたは 'if(temp!= NULL){... while ...}'を実行する必要があります。 'temp 'を参照する前に、' malloc'が成功したことを確認する必要があります。 –

+0

私は編集しました。あなたは "// insert(line_list)"で何をしたいのか分かります。私は文字として行を取得し、リンクされたリストに格納したい。私のコードは最初の行を正常に取得しますが、w/o ctrl + Cコマンドを停止しません。 – user1289547

2
while ((ch = getchar()) != EOF) { // now you have your valid ch 
    if (ch == '\n') break; // end-of-line is a quitter 
} 

EDITHは言う:abtract対concret。 さて、私は戻って一歩を行くと、あなたがEOFに達したときのCHの値であり、どのようなコードをデバッグするときの擬似コード

while ((ch = getchar()) != EOF) { 
    // this is a foreverloop until you hit end of file 

    // now comes the state machine 
    if (ch != NEWLINE) { 
    // collect the string 
    string.add(ch); // pseudocode 
    } else { 
    // do some accountings with the collected string 
    list.add(string); // pseudocode 
    string.print(); 
    } 
} 
+0

ピーターがあなたを正しい方向に向ける。 –

+0

ファイルを読み込むことさえありません。私はプログラムを実行した後に印刷物を見ることができません。 – user1289547

+0

@ user1289547質問を編集して、コードをどのように修正したかを確認してください。 –

関連する問題