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

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

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

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

Q&A

2回答

827閲覧

ファイルがない場合は自動的に生成して書き込みを行うようにしたい

nagotta

総合スコア6

C

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

0グッド

0クリップ

投稿2022/08/09 21:47

前提

fwrite()をバイナリモードで書き込みたいのですが、書き込み対象のファイルが存在しない状態で実行したところsegmentation faultが発生してしまいます。

実現したいこと

ファイルが存在しない状態で実行したら自動的にファイルが生成されてそこに書き込みを行われるようにしたい。

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

Segmentation fault

該当のソースコード

C言語

1#include <stdio.h> 2#include <stdlib.h> 3#include <time.h> 4 5void vernull(int argc, char *argv[], FILE *ofp, char fname[]); 6void verother(int argc, char *argv[], FILE *ofp, char fname[]); 7 8int main(int argc, char *argv[]){ 9 FILE *ofp; 10 char fname[32] = "input2.txt"; 11 12 ofp = fopen(fname, "rb"); 13 if(ofp == NULL){ 14 vernull(argc, argv, ofp, fname); 15 }else{ 16 verother(argc, argv, ofp, fname); 17 } 18 19 return 0; 20} 21 22void vernull(int argc, char *argv[], FILE *ofp, char fname[]){ 23 FILE *wfp; 24 char tmp[32], str[64]; 25 int m1, m2, tmoney = 0, t, dayin = 0, dayout = 0; 26 struct tm *local; 27 time_t timer; 28 time(&timer); 29 local = localtime(&timer); 30 puts("最終更新日時 : 記録を開始します"); 31 puts("前回の所持金 : 0円"); 32 if(argc == 2){ 33 dayin = atoi(argv[1]); 34 printf("今日の収入額 : %d\n", dayin); 35 } 36 puts("----------"); 37 printf("今日の支出額 : "); 38 scanf("%d", &dayout); 39 tmoney = tmoney - dayout + dayin; 40 puts("----------"); 41 printf("現在の所持金 : %d円\n", tmoney); 42 t = (tmoney + 16381) / 173; 43 wfp = fopen(fname, "wb"); 44 fwrite(&t, sizeof(int), 1, wfp); 45 fprintf(wfp, "%d %d %d %d %d %d\n", local->tm_year+1900, local->tm_mon+1, local->tm_mday, local->tm_hour, local->tm_min, local->tm_sec); 46 fclose(wfp); 47 48} 49 50void verother(int argc, char *argv[], FILE *ofp, char fname[]){ 51 FILE *wfp; 52 char tmp[32], str[64]; 53 int m1, m2, tmoney = 0, t, dayin = 0, dayout = 0; 54 int year, month, day, h, m, s; 55 struct tm *local; 56 time_t timer; 57 time(&timer); 58 local = localtime(&timer); 59 fread(&t, sizeof(int), 1, ofp); 60 fscanf(ofp, "%d%d%d%d%d%d", &year, &month, &day, &h, &m, &s); 61 printf("最終更新日時 : %d年%d月%d日%d時%d分%d秒\n", year, month, day, h, m, s); 62 tmoney = t * 173 - 16381; 63 printf("前回の所持金 : %d円\n", tmoney); 64 if(argc == 2){ 65 dayin = atoi(argv[1]); 66 printf("今日の収入額 : %d\n", dayin); 67 } 68 puts("----------"); 69 printf("今日の支出額 : "); 70 scanf("%d", &dayout); 71 tmoney = tmoney - dayout + dayin; 72 puts("----------"); 73 printf("現在の所持金 : %d円\n", tmoney); 74 t = (tmoney + 16381) / 173; 75 wfp = fopen(fname, "wb"); 76 fwrite(&t, sizeof(int), 1, wfp); 77 fprintf(wfp, "%d %d %d %d %d %d\n", local->tm_year+1900, local->tm_mon+1, local->tm_mday, local->tm_hour, local->tm_min, local->tm_sec); 78 fclose(wfp); 79 80}

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

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

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

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

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

guest

回答2

0

wfp = fopen(fname, "w+b") とオプションに + を追加すれば、ファイルがないときに新規作成します。

投稿2022/08/09 23:02

編集2022/08/09 23:03
shiracamus

総合スコア5406

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

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

RiaFeed

2022/08/10 01:36 編集

確かbとaは+入れなくても存在しない場合は新規作成するはず (追記)bじゃなくてwですね、今気づきましたw
shiracamus

2022/08/10 01:22 編集

w だけで新規作成しますね。+ で read もできるようになるだけでした。 となると、ディレクトリが存在してないか、ディレクトリへの書込み許可がない可能性がありますね。
guest

0

wfp = fopen(fname, "wb");

ファイル作成が失敗した場合、wfpはNULLとなってしまいますが、その状態でそのまま突き進んでるのでは

投稿2022/08/09 22:21

y_waiwai

総合スコア87693

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.53%

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

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

質問する

関連した質問