teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

追記

2017/12/11 23:44

投稿

LouiS0616
LouiS0616

スコア35678

answer CHANGED
@@ -1,1 +1,58 @@
1
- `/n`じゃなくて`\n`では?
1
+ `/n`じゃなくて`\n`では?
2
+
3
+ 追記
4
+ ---
5
+ こちらのコードで動作確認できました。[Wandbox](https://wandbox.org/permlink/6ojKA8M1LE6DS4Au)
6
+ 追加した関数は表記を簡単にする目的しかありませんので、適宜読み捨ててください。
7
+ ```C
8
+ #include <stdio.h>
9
+ #include <stdlib.h>
10
+
11
+ typedef struct {
12
+ int code;
13
+ char name[100];
14
+ int math;
15
+ int eng;
16
+ } Student;
17
+
18
+ int fscan_student(FILE *fp, Student *dst) {
19
+ return fscanf(
20
+ fp, "%d%s%d%d\n",
21
+ &dst->code, dst->name, &dst->math, &dst->eng
22
+ );
23
+ }
24
+ int fprint_student(FILE *fp, const Student *src) {
25
+ return fprintf(
26
+ fp, "番号%d番%sの数学は%d点で,英語は%d点.\n",
27
+ src->code, src->name, src->math, src->eng
28
+ );
29
+ }
30
+
31
+ int main(void) {
32
+ FILE *fp = fopen("test.txt", "r");
33
+ if(fp == NULL) {
34
+ return EXIT_FAILURE;
35
+ }
36
+
37
+ Student students[20];
38
+
39
+ while(fgetc(fp) != '\n');
40
+ for(int i = 0; fscan_student(fp, &students[i]) != EOF; ++i) {
41
+ fprint_student(stdout, &students[i]);
42
+ }
43
+
44
+ fclose(fp);
45
+ return EXIT_SUCCESS;
46
+ }
47
+ ```
48
+
49
+ cateyeさんがご指摘されている点に加えて、fgetcの戻り値の扱いに誤りがありました。
50
+ > ```C
51
+ while (fgetc(fp) != "/n") ;
52
+ > ```
53
+
54
+ このままでは、fgetcの戻り値と比較しているのは文字列のアドレスです。
55
+ 文字自体と比較するためには、シングルクオーテーションで括る必要があります。
56
+ ```C
57
+ while(fgetc(fp) != '\n');
58
+ ```