2012-02-27 11 views
0

私は学生の詳細の.txtファイルを持っています。次のように学生の詳細は以下のとおりです。リンクされたリストとファイルI/O

Std_no: 222 
Std_name: Dani 
Std_gender: M 

Std_no: 345 
Std_name: John 
Std_gender: M 

私が行っていることは、私はメンバーを含む構造体を作成したことである:

struct student 
{ 
    int Std_no; 
    char* Std_name; 
    Char* Std_gender; 
} 

私は(学生構造)を指すリンクリストを定義しているので、出力を取り戻すときに反復することができます。私が達成しようとしています何

struct sstudent_elements 
    { 
     struct student *p 
     struct student_element *next; 
    } 

は、.txtファイルを読み取ることができ、学生の構造体のメンバに値を割り当てることです。助けをよろしくお願いいたします&提案。私がやっていることに間違いや問題がある場合は、私に教えてください。

よろしくお願いいたします。

+5

あなたが直面している具体的な問題は何ですか? –

+5

何があなたを引きつけましたか?読み込むためにファイルを開く?テキストの正しい部分を抽出しますか?構造体に割り当てる?リンクされたリストを作成しますか? – alex

+2

この宿題はありますか?もしそうなら、そのようなタグを付けてください。 – jwddixon

答えて

0

これは宿題のようですが、そのようにタグ付けする必要があります。

fopenを読むことをお勧めします。これは、ファイルにアクセスするFILEオブジェクトを取得するのに役立ちます。fscanfの使用例を読み上げてください。 scanfはちょっと難しいので、fgetsを使って "手で"行を解析して行やstrchrなどの呼び出しを取得してフィールド区切りを見つける方が簡単かもしれません。

+0

ありがとうございます。投稿にタグを付けるにはどうすればいいですか? – HShbib

+0

ファイルが改行で分割されることがわかっているので、 'strtok'は' fscanf'よりもはるかに優れています。 –

+0

strtokは初心者には紛らわしいものですが、APIは直感的ではありません。私は人々にstrchrを使用し、手作業で区切り文字を除外するように指示する傾向があります。 – Perry

0

これを試してみてください:

typedef struct 
{ 
    int Std_no; 
    char* Std_name; 
    char* Std_gender; 
} student; 

int parseStdNo(char *line) 
{ 
    return atoi(line + 8); 
} 

char *parseStdName(char *line) 
{ 
    return line + 10; 
} 

char *parseStdGender(char *line) 
{ 
    return line + 12; 
} 

int main() 
{ 
    char *fileLocation = "/path/to/my/file"; 
    FILE *file = fopen(fileLocation, "r"); 

    if (!file) 
    { 
     printf("%s\n", strerror(errno)); 
    } 

    // assume max file size of 1 kb, any more and you may consider malloc-ing your array 
    char buffer[1024]; 

    // assume max of 128 students, any more and you may consider malloc-ing your array 
    student students[128]; 

    if (fread(buffer, 1, sizeof(buffer), file)) 
    { 
     // buffer now contains our file data 
     char *line = strtok(buffer, "\n"); 
     int studentIndex = 0; 

     students[studentIndex].Std_no = parseStdNo(line); 

     // 0 is number, 1 is name, 2 is gender 
     int lineType = 1; 

     while ((line = strtok(NULL, "\n"))) 
     { 
      if (lineType == 3) 
      { 
       studentIndex++; 
       lineType = 0; 
      } 

      switch (lineType) { 
       case 0: 
       { 
        students[studentIndex].Std_no = parseStdNo(line); 
        break; 
       } 
       case 1: 
       { 
        students[studentIndex].Std_name = parseStdName(line); 
        break; 
       } 
       case 2: 
       { 
        students[studentIndex].Std_gender = parseStdGender(line); 
        break; 
       } 
      } 

      lineType++; 
     } 

     for (int i = 0; i <= studentIndex; i++) { 
      printf("student\n\tnumber %i\n\tname: %s\n\tgender: %s\n", students[i].Std_no, students[i].Std_name, students[i].Std_gender); 
     } 
    } 
    else { 
     printf("could not read from file\n"); 
    } 

    getchar(); 

    return 0; 
} 
+0

[宿題タグ](http://stackoverflow.com/tags/homework/info)から:「問題に対する完全な解決策を求めないでください。あなたの宿題はここにはありません」 。 –

+0

@OliCharlesworthタグが追加される前に私の答えが始まった –

関連する問題