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

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

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

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

Q&A

3回答

8500閲覧

[C言語]fopen()がうまくいかない

aiai8976

総合スコア112

C

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

0グッド

0クリップ

投稿2020/05/22 00:44

編集2020/05/22 02:56

前提・実現したいこと

単純なfopenでファイルを開くことができません。
その理由として読み書き実行権限がないのかと思っているのですが、main.cのファイルから同じ階層のsample.csvファイルに書き込みをしたい場合にはどのようなコマンドになりますか。

chmod 777 sample.csv

これで大丈夫でしょうか。
また、他にファイルを開くことができない原因はあるのでしょうか。

エラー

ファイルの読み込みに失敗

該当のソースコード

void* User_Func(HPS3D_HandleTypeDef *handle,AsyncIObserver_t *event) { FILE *fp; fp=fopen("mesure.csv", "w"); if( fp != 0){ printf("ファイルの読み込みに失敗\n"); return 0; } fprintf(fp, "Hello!"); int indx = 0; if(event->AsyncEvent == ISubject_Event_DataRecvd) { switch(event->RetPacketType) { case SIMPLE_ROI_PACKET: printf("distance average:%d\n",event->MeasureData.simple_roi_data[0].distance_average); break; case FULL_ROI_PACKET: printf("distance average:%d\n",event->MeasureData.full_roi_data[0].distance_average); break; case FULL_DEPTH_PACKET: printf("distance average:%d\n",event->MeasureData.full_depth_data->distance_average); //printf("x:%d, y:%d, z:%d\n", event->MeasureData.point_cloud_data->point_data->x, event->MeasureData.point_cloud_data->point_data->y, event->MeasureData.point_cloud_data->point_data->z); for(int i=0; i<event->MeasureData.point_cloud_data->points; i++){ printf("x:%f, y:%f, z:%f\n", (event->MeasureData.point_cloud_data->point_data+i)->x, (event->MeasureData.point_cloud_data->point_data+i)->y, (event->MeasureData.point_cloud_data->point_data+i)->z); fprintf(fp, "%f,%f,%f\n", (event->MeasureData.point_cloud_data->point_data+i)->x, (event->MeasureData.point_cloud_data->point_data+i)->y, (event->MeasureData.point_cloud_data->point_data+i)->z); } break; case SIMPLE_DEPTH_PACKET: printf("distance average:%d\n",event->MeasureData.simple_depth_data->distance_average); break; case OBSTACLE_PACKET: break; case NULL_PACKET: break; default: printf("system error\n"); break; } } fclose(fp); // 1回計測して終了 exit(0); }

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

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

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

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

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

y_waiwai

2020/05/22 00:46

コードがないとどーしよーもないですね
coco_bauer

2020/05/22 01:39

仮想環境で作っているプログラムのファイルを、teratailで質問を書いている環境(PC?)にメール送信すれば、質問に追加できるのではないでしょうか?
dodox86

2020/05/22 02:04

> chmod 777 sample.csv > これで大丈夫でしょうか。 やみくもな対応策の前にまず原因を確認しましょう。仮想環境とはlinux VMなどですか。dockerコンテナ上であったりしますか。 fopenのエラー後、errnoの値は何になっていますか。 https://linuxjm.osdn.jp/html/LDP_man-pages/man3/fopen.3.html sample.csv が存在するディレクトリとsample.csv自体ののオーナーやグループ、権限はどのようになっていますか。 ls -l <sample.csvが存在するディレクトリ ls -l <sample.csv自体>
aiai8976

2020/05/22 02:44

すみません。記載できましたので、確認おねがいします。
coco_bauer

2020/05/22 03:17

ファイル名が"mesure.csv"ではなく、"measure.csv"だったりしませんか? 「測定」の英語は"measure"ですけど。(スペイン語やフランス語では"mesure"らしいですが) まず、ファイルの存在を確認してみましょう。
aiai8976

2020/05/22 03:34

すいません。スペルミスですが、名前は一致しています。
guest

回答3

0

fopen()で何らかのエラーが出たときにNULLが返ってくる仕様なので、
エラーチェックの判定が逆です。

C

1 fp=fopen("mesure.csv", "w"); 2 if( fp != 0){ ← 「fp == NULL」 が正しい 3 printf("ファイルの読み込みに失敗\n"); 4 return 0; 5 } 6 fprintf(fp, "Hello!");

またfopen()でNULLが返ってきた場合、errnoにエラーコードが返ってくるので、
strerror()関数等でエラーメッセージを表示するのが良いと思います。

※動作検証可能とするため単独で確認ができるようにしました。

C

1#include <stdio.h> 2#include <string.h> 3#include <errno.h> 4 5int main( void ) { 6 FILE *fp; 7 fp=fopen("mesure.csv", "w"); 8 if( fp == NULL){ 9 printf("ファイルのオープンに失敗(%s)\n", strerror( errno ) ); 10 return 0; 11 } 12 13 printf( "オープンに成功\n" ); 14 15 return 0; 16}

上記ソースコードを「hoge.c」というファイルに保存しておいてください。
以下は「hoge.c」から「hoge」という実行ファイルを作成し、それを実行した結果です。

terminal

1(この時点でhoge.cというファイルが存在しているとして…) 2$make hoge 3cc hoge.c -o hoge 4$touch mesure.csv 5$chmod 666 mesure.csv 6$ls -l mesure.csv 7-rw-rw-rw- 1 hidezzz hidezzz 0 5月 22 16:14 mesure.csv 8$./hoge 9オープンに成功 10$chmod 444 mesure.csv 11$ls -l mesure.csv 12-r--r--r-- 1 hidezzz hidezzz 0 5月 22 16:16 mesure.csv 13$./hoge 14ファイルのオープンに失敗(Permission denied)

投稿2020/05/22 03:50

編集2020/05/23 02:37
hidezzz

総合スコア1248

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

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

aiai8976

2020/05/22 06:43

``` main.c: In function ‘User_Func’: main.c:52:65: error: ‘errno’ undeclared (first use in this function) printf("ファイルのオープンに失敗(%s)\n", strerror(errno)); ^~~~~ main.c:52:65: note: each undeclared identifier is reported only once for each function it appears in ``` このようなエラーが発生します。 また、fp==NULLにするとそのままif文以降の処理が実行されます。
hidezzz

2020/05/22 07:23

単独で動作確認出来るように回答で提示したソースコードを修正しました。 そちらで動作確認をすることは可能ですか?
aiai8976

2020/05/23 02:03

実行時にコマンドがありませんと出るのですが、原因は何でしょうか。
hidezzz

2020/05/23 02:39

hogeというコマンドが無いということでしたらソースコードからコンパイルして作成する必要があります。 回答にコンパイル手順を追記しました。
aiai8976

2020/05/23 02:54

ご丁寧にありがとうございます。 この場合は同じように実行できました!
hidezzz

2020/05/23 03:06

了解です。 で、最初の質問の疑問点は解決したということでよろしいでしょうか?
aiai8976

2020/05/23 03:08

そうですね。権限が原因ではなかったということがわかりました。 他に考えられる原因は何かありますか?
hidezzz

2020/05/23 03:49

こちらで提示したソースコードの実行が示している通り、 正しい手順をふめばfopen()でファイルをオープンすることができます。 またエラーが発生した場合は、その原因を表すエラーメッセージも知ることができます。 後は質問で示したソースに対して、正しい手順になるように修正するだけです。 質問で提示されているソースにおいて、fopen()の戻り値の判定の仕方が間違っていることは、 すでに私の回答で指摘済みです。
guest

0

それで大丈夫ですが、

また、他にファイルを開くことができない原因はあるのでしょうか。

あなたのコードにミスがあれば開くことはできません


fp=fopen("mesure.csv", "w");

書き込みモードでオープンされてますが、その実行ファイルがある場所は書き込みができるディレクトリなんでしょうか。
sudo権限じゃないと書き込みできない場所で実行してる場合は、こいつは失敗します

いちど、ユーザディレクトリにその実行ファイルを移動させて実行してみればどうでしょう。

投稿2020/05/22 00:47

編集2020/05/22 03:00
y_waiwai

総合スコア88042

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

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

aiai8976

2020/05/22 02:45

コードを記載したので確認お願いします。
y_waiwai

2020/05/22 02:47

これで、 printf("ファイルの読み込みに失敗\n"); が表示されるというはなしでしょうか?
aiai8976

2020/05/22 02:54

そうです。fileを開くことができません。
aiai8976

2020/05/22 03:37 編集

sudoで実行を行なっているので、おそらく大丈夫かと思います。
SHOMI

2020/05/22 04:42

hidezzzさんの回答にも書かれていますが、ファイルを開けたときにエラー表示するコードになっていますよ
guest

0

せいぜい読み書きのみで実行権は不要です。
chmod 666 sample.csv

コードを提示してください。

投稿2020/05/22 01:00

DreamTheater

総合スコア1095

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

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

aiai8976

2020/05/22 02:45

コードを記載したので確認お願いします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問