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

回答編集履歴

6

追記

2020/01/23 06:47

投稿

Y.H.
Y.H.

スコア7918

answer CHANGED
@@ -1,3 +1,58 @@
1
+ 戻り値でファイルポインタを返していいのであればFileopen()に引数として渡す必要ないので
2
+ こんな感じになると思います。
3
+
4
+ ```
5
+ #include <stdio.h>
6
+
7
+ FILE* Fileopen(char namehead[100]) {
8
+ FILE *fp = NULL;
9
+
10
+ char filename[100];
11
+ int fnumber = 0;
12
+ errno_t err = 0;
13
+
14
+ while (err == 0) {
15
+ fnumber++;
16
+ sprintf_s(filename, sizeof(filename), "%s(%d).txt", namehead, fnumber);
17
+
18
+ err = fopen_s(&fp, filename, "r");
19
+ if (err == 0) {
20
+ fclose(fp);
21
+ }
22
+ }
23
+
24
+ err = fopen_s(&fp, filename, "w");
25
+ if (err == 0) {
26
+ fprintf(fp, "%d\n", fnumber);
27
+ } else {
28
+ fp = NULL;
29
+ }
30
+
31
+ return fp;
32
+ }
33
+
34
+ int main() {
35
+ FILE *fp1, *fp2;
36
+
37
+ fp1 = Fileopen("f1");
38
+ fp2 = Fileopen("f2");
39
+
40
+ if (fp1 != NULL) {
41
+ fprintf(fp1, "1行追加\n");
42
+ fclose(fp1);
43
+ }
44
+
45
+ if (fp2 != NULL) {
46
+ fprintf(fp2, "1行追加\n");
47
+ fclose(fp2);
48
+ }
49
+
50
+ return 0;
51
+ }
52
+ ```
53
+
54
+ ----
55
+
1
56
  `fileopen()`の引数は`FILE**`で受けて`fopen_s()`の第1引数には`&fp`ではなく`fp`をそのまま渡します。
2
57
  ※質問記載のコードをコンパイルすると`main()`で`fileopen()`の呼び出し時に型が違う旨`warning`出てると思うんですが。。。
3
58
 

5

追記

2020/01/23 06:47

投稿

Y.H.
Y.H.

スコア7918

answer CHANGED
@@ -4,6 +4,8 @@
4
4
  ```C
5
5
  int fileopen(FILE** fp) {
6
6
  //略
7
+ while (error == 0) { // ← これもNULLじゃなくて0
8
+ //略
7
9
  if (error != fopen_s(fp, filename, "r") /* これ何?→ == NULL */) {
8
10
  //略
9
11
  error = fopen_s(fp, filename, "w");

4

回答修正

2020/01/21 13:13

投稿

Y.H.
Y.H.

スコア7918

answer CHANGED
@@ -4,10 +4,12 @@
4
4
  ```C
5
5
  int fileopen(FILE** fp) {
6
6
  //略
7
- if (error != fopen_s(fp, filename, "r") == NULL) {
7
+ if (error != fopen_s(fp, filename, "r") /* これ何?→ == NULL */) {
8
8
  //略
9
9
  error = fopen_s(fp, filename, "w");
10
+ if (error == 0) { // エラーじゃないときだけ出力しましょう。
10
- fprintf(*fp, "%d\n", n);
11
+ fprintf(*fp, "%d\n", n);
12
+ }
11
13
  //略
12
14
  }
13
15
  ```

3

回答修正

2020/01/21 13:06

投稿

Y.H.
Y.H.

スコア7918

answer CHANGED
@@ -7,6 +7,7 @@
7
7
  if (error != fopen_s(fp, filename, "r") == NULL) {
8
8
  //略
9
9
  error = fopen_s(fp, filename, "w");
10
+ fprintf(*fp, "%d\n", n);
10
11
  //略
11
12
  }
12
13
  ```

2

追記

2020/01/21 12:38

投稿

Y.H.
Y.H.

スコア7918

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

1

誤記修正

2020/01/21 12:29

投稿

Y.H.
Y.H.

スコア7918

answer CHANGED
@@ -6,6 +6,6 @@
6
6
  if (error != fopen_s(fp, filename, "r") == NULL) {
7
7
  //略
8
8
  error = fopen_s(fp, filename, "w");
9
-
9
+ //略
10
10
  }
11
11
  ```