回答編集履歴

6

追記

2020/01/23 06:47

投稿

Y.H.
Y.H.

スコア7914

test CHANGED
@@ -1,3 +1,113 @@
1
+ 戻り値でファイルポインタを返していいのであればFileopen()に引数として渡す必要ないので
2
+
3
+ こんな感じになると思います。
4
+
5
+
6
+
7
+ ```
8
+
9
+ #include <stdio.h>
10
+
11
+
12
+
13
+ FILE* Fileopen(char namehead[100]) {
14
+
15
+ FILE *fp = NULL;
16
+
17
+
18
+
19
+ char filename[100];
20
+
21
+ int fnumber = 0;
22
+
23
+ errno_t err = 0;
24
+
25
+
26
+
27
+ while (err == 0) {
28
+
29
+ fnumber++;
30
+
31
+ sprintf_s(filename, sizeof(filename), "%s(%d).txt", namehead, fnumber);
32
+
33
+
34
+
35
+ err = fopen_s(&fp, filename, "r");
36
+
37
+ if (err == 0) {
38
+
39
+ fclose(fp);
40
+
41
+ }
42
+
43
+ }
44
+
45
+
46
+
47
+ err = fopen_s(&fp, filename, "w");
48
+
49
+ if (err == 0) {
50
+
51
+ fprintf(fp, "%d\n", fnumber);
52
+
53
+ } else {
54
+
55
+ fp = NULL;
56
+
57
+ }
58
+
59
+
60
+
61
+ return fp;
62
+
63
+ }
64
+
65
+
66
+
67
+ int main() {
68
+
69
+ FILE *fp1, *fp2;
70
+
71
+
72
+
73
+ fp1 = Fileopen("f1");
74
+
75
+ fp2 = Fileopen("f2");
76
+
77
+
78
+
79
+ if (fp1 != NULL) {
80
+
81
+ fprintf(fp1, "1行追加\n");
82
+
83
+ fclose(fp1);
84
+
85
+ }
86
+
87
+
88
+
89
+ if (fp2 != NULL) {
90
+
91
+ fprintf(fp2, "1行追加\n");
92
+
93
+ fclose(fp2);
94
+
95
+ }
96
+
97
+
98
+
99
+ return 0;
100
+
101
+ }
102
+
103
+ ```
104
+
105
+
106
+
107
+ ----
108
+
109
+
110
+
1
111
  `fileopen()`の引数は`FILE**`で受けて`fopen_s()`の第1引数には`&fp`ではなく`fp`をそのまま渡します。
2
112
 
3
113
  ※質問記載のコードをコンパイルすると`main()`で`fileopen()`の呼び出し時に型が違う旨`warning`出てると思うんですが。。。

5

追記

2020/01/23 06:47

投稿

Y.H.
Y.H.

スコア7914

test CHANGED
@@ -7,6 +7,10 @@
7
7
  ```C
8
8
 
9
9
  int fileopen(FILE** fp) {
10
+
11
+ //略
12
+
13
+ while (error == 0) { // ← これもNULLじゃなくて0
10
14
 
11
15
  //略
12
16
 

4

回答修正

2020/01/21 13:13

投稿

Y.H.
Y.H.

スコア7914

test CHANGED
@@ -10,13 +10,17 @@
10
10
 
11
11
  //略
12
12
 
13
- if (error != fopen_s(fp, filename, "r") == NULL) {
13
+ if (error != fopen_s(fp, filename, "r") /* これ何?→ == NULL */) {
14
14
 
15
15
  //略
16
16
 
17
17
  error = fopen_s(fp, filename, "w");
18
18
 
19
+ if (error == 0) { // エラーじゃないときだけ出力しましょう。
20
+
19
- fprintf(*fp, "%d\n", n);
21
+ fprintf(*fp, "%d\n", n);
22
+
23
+ }
20
24
 
21
25
  //略
22
26
 

3

回答修正

2020/01/21 13:06

投稿

Y.H.
Y.H.

スコア7914

test CHANGED
@@ -16,6 +16,8 @@
16
16
 
17
17
  error = fopen_s(fp, filename, "w");
18
18
 
19
+ fprintf(*fp, "%d\n", n);
20
+
19
21
  //略
20
22
 
21
23
  }

2

追記

2020/01/21 12:38

投稿

Y.H.
Y.H.

スコア7914

test CHANGED
@@ -1,4 +1,6 @@
1
1
  `fileopen()`の引数は`FILE**`で受けて`fopen_s()`の第1引数には`&fp`ではなく`fp`をそのまま渡します。
2
+
3
+ ※質問記載のコードをコンパイルすると`main()`で`fileopen()`の呼び出し時に型が違う旨`warning`出てると思うんですが。。。
2
4
 
3
5
 
4
6
 

1

誤記修正

2020/01/21 12:29

投稿

Y.H.
Y.H.

スコア7914

test CHANGED
@@ -14,7 +14,7 @@
14
14
 
15
15
  error = fopen_s(fp, filename, "w");
16
16
 
17
-
17
+ //略
18
18
 
19
19
  }
20
20