92145


現在C言語の下記の課題に取り組んでいるのですが、ログファイルへの出力が "例"
とは別の形式で出力されてしまう事、一個の記録しか保存、出力できない事に対して修正方法が分からず、どなたか教えて頂けないでしょうか？

> #### 課題
>
> 演算結果と実行した日、時間、秒をログファイルとして保存する  
>  ログの上限は1000行とする（上限を超過するケースはひとまず考慮しなくて良い）
>
> 例） log.txt に 以下の内容を記録  
>  2015/04/27 14:30:51, 5 + 6, 11

**現状の出力結果:**

[code]

    Fri Nov 11 10:51:27 2022
    5+510.000000
    
[/code]

**現状のコード:**

[code]

    #include <stdio.h>
    #include <time.h>
    
    int main() {
    int num1, num2;
    char op;
    float answer;
    int r;
    FILE* fp;
    
    fp = fopen("log.txt", "w");
    
    if (fp == NULL) {
    printf("ファイルオープン失敗\n");
    return -1;
    }
    
    r=scanf("%d%c%d", &num1, &op, &num2);
    if (r != 3) {
    puts("input error");
    return 1;
    }
    
    if (op == '+') {
    answer = num1 + num2;
    }
    else if (op == '-') {
    answer = num1 - num2;
    }
    else if (op == '*') {
    answer = num1 * num2;
    }
    else if (op == '/') {
    answer = (float)num1 / num2;
    }
    printf("%f\n", answer);
    
    time_t t = time(NULL);
    char* s = ctime(&t);
    
    printf("%s",s);
    
    fprintf(fp, "%s%d%c%d%f\n",s,num1,op,num2, answer);
    fclose(fp);
    
    return 0;
    
    }
    
[/code]


CC BY-SA 4.0
2022-11-11T02:13:09.207
92143
2022-11-11T03:46:36.433
2022-11-11T03:46:36.433
3060
55007
question
c
C言語の日付の出力について


例）と別の形式で出力されてしまう件は、日時情報を文字列化するために選択した方法の問題ですね。  
`ctime()`関数は例）に示された形式にはなりません。  
[ctime()で経過時間を文字列にする](https://yu-
nix.com/archives/c-time/#ctime\(\)%E3%81%A7%E7%B5%8C%E9%81%8E%E6%99%82%E9%96%93%E3%82%92%E6%96%87%E5%AD%97%E5%88%97%E3%81%AB%E3%81%99%E3%82%8B)

こちらの記事を参考に`time_t`型の値を`tm`構造体に変換して、`fprintf()`関数で年月日時分秒のデータを個別に指定するか、`strftime()`関数で出力したいフォーマットを指定して変換するか、のどちらかあたりでしょうね。  
[経過時間をlocaltime()で時刻用の構造体に変換する](https://yu-
nix.com/archives/c-time/#tm%E6%A7%8B%E9%80%A0%E4%BD%93%E3%82%92%E6%9B%B8%E5%BC%8F%E3%81%A7%E6%96%87%E5%AD%97%E5%88%97%E3%81%AB%E3%81%99%E3%82%8B)  
[tm構造体を書式で文字列にする](https://yu-
nix.com/archives/c-time/#tm%E6%A7%8B%E9%80%A0%E4%BD%93%E3%82%92%E6%9B%B8%E5%BC%8F%E3%81%A7%E6%96%87%E5%AD%97%E5%88%97%E3%81%AB%E3%81%99%E3%82%8B)

* * *

一個の記録しか保存、出力できない件は、@774RR
さんがコメントしている内容と関係があり、作成したプログラムの実行を継続している中で何回も演算する場合は、コメントのようにログファイルをオープンしている間に「入力」・「演算」・「ログ出力」をセットにして繰り返すループ処理を行う必要があります。

そうでは無くて、作成したプログラム自身は「入力」・「演算」・「ログ出力」を1回だけ行い、そのプログラム実行を何回も繰り返す場合は、以下が原因と対処になります。

この行でファイルオープンのモードを書き込み(新規作成)にしているからですね。

[code]

    fp = fopen("log.txt", "w");
    
[/code]

こちらのように`append`モードでオープンすれば追記されるようになるはずです。

[code]

    fp = fopen("log.txt", "a");
    
[/code]


CC BY-SA 4.0
2022-11-11T03:11:34.347
92145
2022-11-11T03:11:34.347
26370
92143
answer