アプリ版:「スタンプのみでお礼する」機能のリリースについて

8行目のfatalに制御が移行してしまいます。
何が原因でファイルを開けないのでしょうか。
fcntl.hはインクルードしています。

1 // この関数によって現在のプレイヤーのデータがファイルに書き込まれる。
2 // これは主にゲーム終了後にクレジット情報を更新するために用いられる。
3 void update_player_data(){
4  int fd, i, read_uid;
5  char burned_byte;

6  fd = open(DATAFILE, O_RDWR);
7  if(fd == -1)
8    fatal("update_player_data()内で、ファイルのオープン中にエラーが発生しました。");
9  read(fd, &read_uid, 4);
10 while(read_uid != player.uid){
11  for(i=0; i < sizeof(struct user) - 4; i++)
12 read(fd, &burned_byte, 1);
13 read(fd, &read_uid, 4);
   }
14 write(fd, &(player.credits), 4);
15 write(fd, &(player.highscore), 4);
16  write(fd, &(player.name), 100);
17 close(fd);
  }

質問者からの補足コメント

  • 早い回答本当にありがとうございます。
    DATAFILEの状態?は
    #define DATAFILE "/var/chance.date" //ユーザデータを格納するファイル
    こんな感じです。
    エラーについてはお察しの通り、
    update_player_data()内で、ファイルのオープン中にエラーが発生し: No such file or directory
    と表示されます。

      補足日時:2021/03/30 12:12
  • 型の情報が何も書いてないです。

    No.4の回答に寄せられた補足コメントです。 補足日時:2021/03/30 12:26
  • ないみたいです。新しく作ったら治りますか?

    No.5の回答に寄せられた補足コメントです。 補足日時:2021/03/30 12:30
  • fopenに書き直してみました。

    warning: incompatible pointer to integer conversion assigning to 'int' from 'FILE *' (aka 'struct _IO_FILE *') [-Wint-conversion]
    fd =fopen(DATAFILE, "w");

      補足日時:2021/03/30 12:43

A 回答 (9件)

fopenをつかうなら、以降の読み書き、クローズなどはfread,fwrite,fcloseを使わないといけません。



まず、いまのまま、open,close,read,writeでいくのか
fopen,fclose,fread,fwriteでいくのか決めた方が良いかと。

いまのままでいくなら、
fd = open(DATAFILE, O_RDWR);を
fd = open(DATAFILE, O_RDWR|O_CREAT);
としてください。
そうすれば、ファイルがないときに、空のファイルを自動で作成してくれます。
    • good
    • 0
この回答へのお礼

手とり足取り教えてくださりありがとうございました。とても参考になりました。

お礼日時:2021/03/30 13:52

ファイルを作れば解決しますが、



ファイルがないときも想定するプログラムであれば、
O_RDWRでエラーが返ったとき、
O_CREATで生成後、再度、O_RDWRでopenするようにするとか。
    • good
    • 0
この回答へのお礼

回答ありがとうございました。この関数に関しては、解決できました。(ファイルがないときも想定するプログラムにしました。)

お礼日時:2021/03/30 13:48

ないみたいです。

新しく作ったら治りますか?

はい。新しく作ってください。
そうすれば、オープンはできます。
    • good
    • 0

No such file or directory は、


そのようなファイル、又はディレクトリはありませんという意味なので、

/var/chance.date をご確認ください。
    • good
    • 0

/var/chance.date は本当に存在しますか。


念の為、/varに移動し、chance.dateがあるか確認してみてください。
この回答への補足あり
    • good
    • 0

No1です



O_RDWR は int になってますか?
この回答への補足あり
    • good
    • 0
この回答へのお礼

早い回答をありがとうございました。open関数の書式を知らないでサンプルコードをそのまま写していたので助かりました。

お礼日時:2021/03/30 13:38

DATAFILEの定義が提示されていないので、どのように定義されているか、わかりませんが、


DATAFILEはオープンするファイル名です。
このファイルが存在しないことが考えられます。
DATAFILEで示されるファイルが実際に存在するかどうか、チェックしてください。
又、DATAFILEは完全パスで指定したほうが確実です。
    • good
    • 0

変数:DATAFILEのファイルが読み書き可でopenできない以外わからない。



その時点で該当ファイルがないとか、書き込める権限がないとかか?
    • good
    • 0

C言語の open() をググると、



int open(const char *path, int mode, [mode_t creat_mode])

とあります。
少なくとも、-1 が戻ってきているので、引数が間違ってると思います。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!