Потоки C не должны создавать новую строку

#c #iostream

#c #iostream

Вопрос:

я пытаюсь создать программу, которая записывает временную метку в файл с помощью c , вот мой код :

 #include <time.h>
#include <iostream>
#include <unistd.h>
#include <fstream>
using namespace std;
int main()
{
    fstream outfile;
    outfile.open("time.txt",ios::out|ios::app);
    string savetime;
    for(;;){
        time_t t = time(NULL);
        savetime=asctime(localtime(amp;t));
        cout<<savetime;
        outfile << savetime << endl;
        sleep(1);
    }
    
}
 

результат этого кода

 Sun Dec 06 01:28:17 2020

Sun Dec 06 01:28:18 2020

Sun Dec 06 01:28:19 2020

Sun Dec 06 01:28:20 2020
 

в каждой строке есть новая строка. я попытался удалить endl at outfile << savetime << endl; , чтобы удалить новые строки, но файл не сохранит новую временную метку. моя цель — сделать вывод следующим образом

 Sun Dec 06 01:28:17 2020
Sun Dec 06 01:28:18 2020
Sun Dec 06 01:28:19 2020
Sun Dec 06 01:28:20 2020
 

заранее спасибо.

Комментарии:

1. Цитирование страницы документации cppreference для asctime : Преобразует заданное календарное время std::tm в текстовое представление следующей фиксированной формы из 25 символов: Www Mmm dd hh:mm:ss yyyyn Обратите внимание n на конец строки формата. Используйте std::strftime вместо этого. Вы можете контролировать все форматирование.

2. Альтернативой являются утилиты new date от C 20 или библиотека данных Говарда Хиннанта , если C 20 вам еще недоступен.

3. Вы можете использовать std::flush вместо std::endl для немедленной записи текста в файл без ввода новой строки. Когда вы удаляете endl, вы не видите вывода, пока поток не будет сброшен. Он будет сброшен, если вы: используете std::endl , std::flush , вызываете outfile.close() или разрешаете уничтожение fstream в конце области видимости путем завершения цикла. Это может позволить вам получить то, что вы хотите, без изменения вашего кода каким-либо другим способом

Ответ №1:

 #include <iostream>
#include <fstream>
#include <ctime>
#include <unistd.h>
using namespace std;
int main()
{
    fstream outfile;
    outfile.open("time.txt",ios::out|ios::app);
    char savetime[100];
    for(;;){
        time_t t = time(NULL);
        strftime(savetime, sizeof(savetime), "%A %c", localtime(amp;t));
        cout<<savetime;
        outfile << savetime<<endl;
        sleep(1);
    }
}
 

благодаря пользователю 4581301

от savetime=asctime(localtime(amp;t)); до strftime(savetime, sizeof(savetime), "%A %c", localtime(amp;t));

Комментарии:

1. Хороший ответ, но вы хотите %a вместо %A того, чтобы дублировать сокращенные названия дней, отображаемые asctime