質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Q&A

解決済

2回答

1065閲覧

[C言語]ファイルの入出力[main関数の外]

kotobuki

総合スコア7

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

0グッド

0クリップ

投稿2020/01/21 12:16

編集2020/01/23 07:56

前提・実現したいこと

ここに質問の内容を詳しく書いてください。
ファイルの入出力をmain関数の外で行いたいため,そのテストプログラムを作成しました.

発生している問題・エラーメッセージ

イメージ説明説明](384d4f32d820bd43a00ce08cac901e9f.png)

エラーメッセージ

該当のソースコード

34行目は空白です.

C言語 Microsoft Visual Studio Community 2019 Version 16.4.3
#include <stdio.h> #include <math.h> int n = 1; int fileopen(FILE* fp) { char filename[100]; errno_t error = 0; while (error == NULL) { sprintf_s(filename, 100, "test%d.txt", n); if (error != fopen_s(&fp, filename, "r") == NULL) { n++; } else { error = fopen_s(&fp, filename, "w"); fprintf(fp, "%d\n", n); } } return 0; } int main() { FILE* fp1; FILE* fp2; fileopen(&fp1); fileopen(&fp2); fclose(fp1); fclose(fp2); return 0; }

試したこと

インターネットで調べたが,わからなかった.
fprint_sなど情報が複雑でわかりにくかったため.

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2020/01/21 12:18

このままではコードが読みづらいので、質問を編集し、<code>ボタンを押し、出てくる’’’の枠の中にコードを貼り付けてください
kotobuki

2020/01/21 12:20

変更しました.
guest

回答2

0

ベストアンサー

戻り値でファイルポインタを返していいのであればFileopen()に引数として渡す必要ないので
こんな感じになると思います。

#include <stdio.h> FILE* Fileopen(char namehead[100]) { FILE *fp = NULL; char filename[100]; int fnumber = 0; errno_t err = 0; while (err == 0) { fnumber++; sprintf_s(filename, sizeof(filename), "%s(%d).txt", namehead, fnumber); err = fopen_s(&fp, filename, "r"); if (err == 0) { fclose(fp); } } err = fopen_s(&fp, filename, "w"); if (err == 0) { fprintf(fp, "%d\n", fnumber); } else { fp = NULL; } return fp; } int main() { FILE *fp1, *fp2; fp1 = Fileopen("f1"); fp2 = Fileopen("f2"); if (fp1 != NULL) { fprintf(fp1, "1行追加\n"); fclose(fp1); } if (fp2 != NULL) { fprintf(fp2, "1行追加\n"); fclose(fp2); } return 0; }

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

C

1int fileopen(FILE** fp) { 2//略 3 while (error == 0) { // ← これもNULLじゃなくて0 4//略 5 if (error != fopen_s(fp, filename, "r") /* これ何?→ == NULL */) { 6//略 7 error = fopen_s(fp, filename, "w"); 8 if (error == 0) { // エラーじゃないときだけ出力しましょう。 9 fprintf(*fp, "%d\n", n); 10 } 11//略 12}

投稿2020/01/21 12:23

編集2020/01/23 06:47
Y.H.

総合スコア7914

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kotobuki

2020/01/21 12:41 編集

回答ありがとうございます.修正したところ,新しくエラーが発生してしまいました. >#include <stdio.h> >#include <math.h> > >int n = 1; > >int fileopen(FILE** fp) { //変更行 > char filename[100]; > errno_t error = 0; > while (error == NULL) { > sprintf_s(filename, 100, "test%d.txt", n); > if (error != fopen_s(fp, filename, "r") == NULL) { //変更行 > n++; > } > else { > error = fopen_s(fp, filename, "w"); //変更行 > fprintf(fp, "%d\n", n); > } > } > return 0; >} > >int main() { > FILE* fp1; > FILE* fp2; > > fileopen(&fp1); > fileopen(&fp2); > > fclose(fp1); > fclose(fp2); > > return 0; >} >0x77223CB3(ntdll.dll)で例外がスローされました.(Testapp.exe内) >0cC0000005:場所0x00000015への書き込み中にアクセス違反が発生しました
Y.H.

2020/01/21 12:39

あぁ見逃してました。 fprintf()は第1引数はFILE*型なので*fpを渡しましょう。 これもコンパイル時にwarning出てると思うんで直ぐに気づけると思うんですが・・・
kotobuki

2020/01/21 12:52

16行目 fprintf(*fp, "%d\n", n); 修正しました. 返信時のエラーがなくなり,質問時のエラーが再発いたしました.
kotobuki

2020/01/21 12:54

重大度レベル コード 説明 プロジェクト ファイル 行 抑制状態 警告 C4047 '==': 間接参照のレベルが 'int' と 'void *' で異なっています。 Testapp D:..\Testapp.c 11 警告 C6387 '*fp' は '0' である可能性があります: この動作は、関数 'fprintf' の指定に従っていません。 Testapp D:..\TESTAPP.C 16 警告 C4047 '==': 間接参照のレベルが 'errno_t' と 'void *' で異なっています。 Testapp D:..\Testapp.c 9 現在発生している警告メッセージです.
Y.H.

2020/01/21 13:09

> main関数の外で行いたいため,そのテストプログラムを作成しました main関数の中では動いているんでしょうか? > 現在発生している警告メッセージです で?メッセージを見てkotobukiさんは何もしないのでしょうか? とりあえずコードは修正しておきましたがここまでにします。
kotobuki

2020/01/23 07:55

修正ありがとうございます. 回答者に丸投げする質問をしてしまい,申し訳ありませんでした.
guest

0

Fileopen関数の型をFIlE型にすることで解決しました.
回答ありがとうございました.

#include <stdio.h> FILE* Fileopen(FILE** fp ,char namehead[100]) { char filename[100]; int flag = 0, fnumber = 1; sprintf_s(filename, 100, "%s(%d).txt", namehead ,fnumber); while (flag == 0) { errno_t error = fopen_s(&fp, filename, "r"); if (error == 0) { fclose(fp); fnumber++; sprintf_s(filename, 100, "%s(%d).txt", namehead, fnumber); } if (error != 0) { errno_t error = fopen_s(&fp, filename, "w"); flag = 1; if (error == 0) { fprintf(fp, "%d\n", fnumber); } } return fp; } int main() { FILE *fp1, *fp2; fp1=Fileopen(&fp1,"f1"); fp2=Fileopen(&fp2,"f2"); fclose(fp1); fclose(fp2); return 0; }

投稿2020/01/23 05:13

編集2020/01/23 05:31
kotobuki

総合スコア7

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Y.H.

2020/01/23 05:25

fopen_s()の第1引数はFILE**型であってFILE***型ではない。 Fileopen()の戻り値はFILE*型で定義しているのにFILE**型の値を返している。 fprintf(fp, "%d\n", n);は不要になったの?
kotobuki

2020/01/23 05:34

fprintfの項を追記しました.申し訳ありません. >fopen_s()の第1引数はFILE**型であってFILE***型ではない。 >Fileopen()の戻り値はFILE*型で定義しているのにFILE**型の値を返している。 すいません.勉強不足のため,警告は表示されていますがエラーはなくなり意図していた動作が確認できたため,解決済みとしてしまいました.
kotobuki

2020/01/23 05:59

このサイトの仕組みを理解していなくて申し訳ありません.BAを変更しました.
Y.H.

2020/01/23 06:51

あぁすみません。 BA催促するつもりはありませんでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問