C言語の質問について fscanfを使ったファイル読み込みが理解できなく、 ファイル書き込みで書き込んだテキストファイルから一行ずつ読み込むという処理がうまくいきません。

C言語の質問について fscanfを使ったファイル読み込みが理解できなく、 ファイル書き込みで書き込んだテキストファイルから一行ずつ読み込むという処理がうまくいきません。 以下コードとなっております。 //============================================== // ファイル読み込み void data_load() { FILE *fp; int cnt = file(); // ファイルの件数を読み込む char dustBox[5]; // \nを保持する変数 struct Addressbook *put; put = Listtop; fp = fopen("C:\\C_Work\\addressbook.txt", "r"); // 読み取りモードで開く if (fp == NULL) { printf(" ファイルの読み込みに失敗しました!!\n"); return; } for (int i = 0; i < cnt; i++) { fscanf(fp, "%-16s%-30s%-50s%-13s", put->name, put->huri, put->add, put->num); } fclose(fp); } //=================================================== // ファイル書き込み void data_save(void) { FILE *fp; fp = fopen("C:\\C_Work\\addressbook.txt", "w+"); // 読み書きモードで開く put = Listtop; // リストの先頭にする if (put == NULL) { printf("ファイルの書き込みに失敗しました!!\n"); return 1; } else if (put->next == NULL) { // データが一つだけなら fprintf(fp, "%-16s%-30s%-50s%-12s\n", put->name, put->huri, put->add, put->num); // ファイルへ出力 } else { do { fprintf(fp, "%-16s%-30s%-50s%-12s\n", put->name, put->huri, put->add, put->num); // ファイルへ出力 put = put->next; // 次のデータを指し示す } while(put != NULL) // NULLになるまで } fclose(fp); } //=================================================== // ファイル中のデータ件数 int file(void) { FILE *fp; int c; int cnt = 0; fp = fopen("C:\\C_Work\\addressbook.txt", "r"); if (fp) { while ((c = getc(fp)) != EOF) { // EOFになるまで一文字ずつ if (c == '\n') cnt++; // \nならばcnt++ } fclose(fp); } return cnt; } //================================================== 汚らしいソースコードで申し訳ありません。 dustboxはfscanfは\nまで読み込んでしまうので、\nを取り除くために定義しました。 もっといい方法があればお教えください。 以上、宜しくお願い致します。

C言語関連 | プログラミング33閲覧xmlns="http://www.w3.org/2000/svg">100

ベストアンサー

0

細かい所までは見てませんが、 printfとscanfでは、フォーマット指定子のフォーマットが異なります。(fscanfやsscanfも同じ) printfの場合は %[フラグ][最小フィールド幅].[精度][長さ修飾子]変換指定子 ですが、 scanfの場合は、 %[代入抑止][最大フィールド幅][修飾子]変換指定子 となります。 scanfには、フラグ指定子である"-"はありませんし、 "5s"と書いても、それは、最大フィールドを示し、 「最大で5文字まで読む」であり、 「5文字分確実に読み込む」を意味しません。 たとえば、 "ABCDEF"を"%5s"で読み取れば、"ABCDE"になりますが、 "ABC DEF"を"%5s"で読み取れば"ABC"になります。 (s指定子は空白文字(スペース、タブ等)が出るまでの連続したデータを読みます)