回答編集履歴
6
追記
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
追記
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
回答修正
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
|
-
|
|
11
|
+
fprintf(*fp, "%d\n", n);
|
|
12
|
+
}
|
|
11
13
|
//略
|
|
12
14
|
}
|
|
13
15
|
```
|
3
回答修正
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
追記
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
誤記修正
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
|
```
|