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

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

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

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

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

4回答

13968閲覧

C言語 fopen_s()のエラー原因

madanai

総合スコア5

C

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

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2020/08/31 02:41

fopen_s()を使用してディレクトリ内のファイルを操作したいのですが、
例えば

C

1FILE* fp; //ファイルポインタ 2 3fopen_s(&fp,"test.txt","r");

で開く場合、「test.txtが存在しない場合」「test.txtが他で使用されている場合」等にエラーが出ると思います。
(もっといろんな原因があることは承知していますが、主に考えられるエラーとして、です。)

エラー処理として、

C

1FILE* fp; //ファイルポインタ 2 3fopen_s(&fp,"test.txt","r"); 4if(fp==NULL){ //読み取り用で開けない場合 5 fopen_s(&fp,"test.txt","w"); 6 if(fp==NULL){      //書き出し用でも開けない場合 7 printf("ファイルが他で使用されています\n"); 8 } 9 else{          //書き出し用では開ける場合 10 printf("ファイルが存在しません\n"); 11 fclose(fp); 12 } 13}

と記述するのはどう思いますか?
ぱっと思い浮かんだのがこの方法でした。

他にもっと良いやり方があればご教授願いたいです。
宜しくお願いします。

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

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

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

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

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

guest

回答4

0

ベストアンサー

戻り値と errno を読むのが真っ当なやりかたかと。
リファレンス参照。

投稿2020/08/31 02:47

episteme

総合スコア16612

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

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

madanai

2020/08/31 04:12

ありがとうございます。 エラー原因を調べられるシステムがあったのですね。 関数ではないようですが、具体的にどう使うかがピンときませんでした...。 errnoというのは内部システムに組み込まれている整数型変数ということで合っていますか?
episteme

2020/08/31 05:02

それもまた、リファレンス参照。
madanai

2020/08/31 06:17

調べて分からないことを質問させていただいています...。 リファレンスにてグローバルマクロと記載があったので、内部に組み込まれている関数かと思いきや 別サイトで「関数ではない」や、「値を代入」等の記載があったので、こんがらがっています。 簡単にでも教えていただけると幸いです。
episteme

2020/08/31 07:42

リファレンスによるとVisual C++ の場合 errno は *_errno() と等価/同義で、なんらかの エラーコードが返ってきます。そいつ(errno)文字列で表現したやつは strerr(errno) で得られます。
madanai

2020/09/01 02:44

参考になりました。 ありがとうございます。
guest

0

C言語でわかることはあくまでも「開けない」ということだけです。

具体的な原因を考えだしたらキリがありません。「開けないよ」とだけ表示すれば充分でしょう。まあ、「存在しないかもよ」とかを添えてもいいと思いますが。断定するのはやめたほうが良いです。

投稿2020/08/31 05:34

HogeAnimalLover

総合スコア4830

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

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

madanai

2020/08/31 06:18

「存在しないから開けない」の場合、プログラム上でファイルを作成したいのですが、 原因が大まかにでも特定できないと難しそうですね...。 ご回答ありがとうございます。
guest

0

fopen_s、errno(エラー番号)調べ方

c

1#include <stdio.h> 2#include <errno.h> //errnoを使用するときに必須 3 4int main ( ) { 5 FILE* fp; 6 int select; 7 8 while ( 1 ) { 9 select = 0; //selectの初期化(ループ内で再使用するため) 10 _set_errno ( 0 ); //errnoの初期化(使う直前に行う) 11 fopen_s ( &fp , "test.csv" , "r" ); 12 if ( fp == NULL ) { 13 printf ( "errno[%d] でファイルが開けません\n" , errno ); 14 } 15 else { 16 printf ( "ファイルを開きました\n" ); 17 fclose ( fp ); 18 } 19 printf ( "[1]もう一度  [2]終了\n" ); 20 while ( 1 ) { 21 printf ( "入力:" ); 22 scanf_s ( "%d" , &select ); 23 if ( select == 1 ) { 24 break; 25 } 26 else if ( select == 2 ) { 27 return 0; 28 } 29 } 30 } 31}

今回の質問であれば、test.txtが存在しない場合は「errno=2」
test.txtが他で使用されている場合は「errno=13」で返ってきました。

投稿2020/09/07 05:31

madanai

総合スコア5

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

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

0

printf("ファイルが存在しません\n");
とでているのに、そのファイルが作られてしまっているってのはどうかと思いますが。

投稿2020/08/31 04:02

y_waiwai

総合スコア88024

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

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

madanai

2020/08/31 04:07

質問内容としては、「ほかに良いやり方ありますか?」です。 同名ファイルが存在しないことを調べるために新規作成しています。 他にやり方があるのであればごご教授願いたいです。 宜しくお願いいたします。
y_waiwai

2020/08/31 04:09

単にそのファイルが存在するかどうかを見ればいいだけのように思いますが。
madanai

2020/08/31 04:17

目視でということでしょうか? プログラム内で、ファイルが開けない原因によって表示を変えたいのです...。 他の方のご回答で「errno」を使うと良いと教えていただいたのですが、 もしよろしければ ・errnoを使用する以外の方法があれば ・errnoを使用した際のコード を教えていただけると非常にうれしいです。 どうぞ宜しくお願いいたします。
y_waiwai

2020/08/31 04:26

errno c言語、でぐぐれば解説が出てくると思います。 Windowsであるなら、APIでファイル存在確認ができます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問