前提
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}

バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/08/10 01:36 編集
2022/08/10 01:22 編集