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

回答編集履歴

2

追記

2017/11/02 14:01

投稿

LouiS0616
LouiS0616

スコア35676

answer CHANGED
@@ -1,4 +1,5 @@
1
1
  次のように書き換えることで、私の環境では正常に動作しました。
2
+ **追記:また、szの値を32に変更していました。simiteiさん、ありがとうございます。**
2
3
  ```C
3
4
  while(fgets(str, sz, fr) != NULL){
4
5
  fprintf(stdout, "%6d ", line);

1

追記

2017/11/02 14:00

投稿

LouiS0616
LouiS0616

スコア35676

answer CHANGED
@@ -16,4 +16,32 @@
16
16
  strはこのときchar*型の変数ですから、sizeof(str)は同一環境では一定です。
17
17
 
18
18
  kmmtprgmさんの環境では、sizeof(str)が8であるようです。
19
- 隠れているヌル文字を含め、8文字表示できているようですから。
19
+ 隠れているヌル文字を含め、8文字取得・表示できているようですから。
20
+
21
+ ---
22
+ ついでなので、ちょっと気になった点を追記します。
23
+ プログラム内のwhile文は、for文に置き換えることで読みやすくなるかと思います。
24
+ ```C
25
+ for(int line = 1; fgets(str, sz, fr) != NULL; line++){
26
+ fprintf(stdout,"%6d ",line);
27
+ fputs(str, stdout);
28
+ }
29
+ ```
30
+
31
+ あと、ファイルを複数開く場合、ファイルポインタの解放はもうちょっと複雑になります。
32
+ ```C
33
+ FILE* fr = fopen("abc.txt", "r");
34
+ if(fr == NULL){
35
+ perror("ReadFileOpen");
36
+ return 0;
37
+ }
38
+
39
+ FILE* fw = fopen("def.txt", "w");
40
+ if(fw == NULL){
41
+ perror("WriteFileOpen");
42
+ fclose(fr);
43
+ return 0;
44
+ }
45
+ ```
46
+
47
+ frのオープンは成功したが、fwのオープンに失敗した場合、frを解放せねばなりません。