Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.11.2021, 18:53   #1
irina712
 
Регистрация: 04.04.2017
Сообщений: 6
По умолчанию Дочитывание чисел из дописываемого файла

Доброго времени суток!
У меня проблема.
Пишу программу на C++, которая должна читать из файла числа и выводить их в консоль. Числа все время будут добавляться в файл, поэтому я поместила в программе бесконечный цикл, чтобы не останавливалась, когда дойдет до конца, потому что после этого числовой ряд может увеличиться.
Но программа выдает не все числа, а последнее, на котором была включена и зацикливает его, а добавление в файл происходит отдельно и в программе не имеет своего отражения.
Как мне сделать так, чтобы выводились все числа по мере их добавления в файл?

Код:
#include <fstream>
#include <iostream>
#include <vector>

int main()
{
	std::vector<double> amount;
	double val;

	std::string operation;
	std::cin >> operation;

	std::ifstream File;

	File.open("C:\\Users\\Рабочий стол\\File.txt");


		while (1 < 2) {

			File >> val;

			amount.push_back(val);

			std::cout << amount.back() << " ";
		}

	File.close();
	}

Последний раз редактировалось BDA; 25.11.2021 в 21:57.
irina712 вне форума Ответить с цитированием
Старый 25.11.2021, 22:04   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Интернет подсказывает:
Код:
    while (true) {
        while (File >> val) {
            amount.push_back(val);
            std::cout << val << " ";
        }
        if (!File.eof()) break;
        File.clear();
        // тут стоит добавить таймер сна, чтобы не сильно нагружать процессор
    }
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 26.11.2021, 09:16   #3
Алексей1153
фрилансер
Форумчанин
 
Регистрация: 11.10.2019
Сообщений: 960
По умолчанию

irina712, предлагаю такой вариант https://onlinegdb.com/cjgFRjzLA

Код:
#include <iostream>
#include <fstream>
#include <thread>
#include <atomic>
#include <chrono>

constexpr const char* filepath="./1.txt";

int main()
{
    using namespace std::chrono_literals;
    
    //очистка файла
    {
        std::ofstream file(filepath);
    }
    
    //поток, пишущий в файл числа
    std::atomic<bool> stop{};
    std::thread trd([&stop]
    {
        int n{1};
        while(!stop)
        {
            std::this_thread::sleep_for(500ms);
            
            std::ofstream file(filepath,std::ios::app);
            if(file.is_open())
            {
                file<<n++<<'\n';
                file.flush();
            }
        }
    });

    //поток, останавливающий процесс записи через 10 секунд
    std::thread stop_trd([&stop]
    {
        std::this_thread::sleep_for(10s);
        stop=true;
    });

    std::ifstream::pos_type last_pos{};
    while(!stop)
    {
        std::this_thread::sleep_for(1000ms);

        std::ifstream file(filepath);
        if(!file.is_open())continue;
        
        file.seekg(last_pos,std::ios_base::beg);
        if(!file)continue;
        
        std::cout<<" opened to read\n";
        
        bool some_read{};
        
        int n{};
        while(file>>n)
        {
            some_read=true;
            std::cout<<n<<',';
            last_pos=file.tellg();
        }
        
        if(some_read)std::cout<<"\n";
    }

    stop_trd.join();
    trd.join();
    
    std::cout<<"done!\n";
    
    return 0;
}
Алексей1153 вне форума Ответить с цитированием
Старый 26.11.2021, 18:30   #4
irina712
 
Регистрация: 04.04.2017
Сообщений: 6
По умолчанию

BDA,
В итоге считываются и отображаются только те числа, которые были в файле до включения программы. Числа, появившиеся после включения программы, не выводятся.
irina712 вне форума Ответить с цитированием
Старый 26.11.2021, 18:40   #5
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

irina712, тогда попробуйте вариант Алексей1153.
Но я свой вариант проверял: запускал программу, дописывал файл в Notepad++, сохранял его, и программа показывала новые числа. Возможно, программа, пишущая файл, не flush'ит его.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Дан файл вещественных чисел. Создать файл целых чисел, содержащий длины всех убывающих последовательностей элементов исходного файла. Например, для исходного файла с элементами 1.7 faza9444 C# (си шарп) 1 27.11.2017 22:23
За один просмотр файла действительных чисел и с использованием очереди напечатать элементы файла в следующем порядке: сначала – вс zenya1998 Паскаль, Turbo Pascal, PascalABC.NET 0 28.04.2016 17:52
Обработка файла на Турбо Паскаль - Удалить из файла файл вещественных чисел максимальную компоненту chudo*** Паскаль, Turbo Pascal, PascalABC.NET 1 24.12.2011 22:51
Скоростное чтение постоянно дописываемого текстового файла GunShot Общие вопросы Delphi 0 30.12.2010 12:03
Открытие файла и создание графика на основе чисел из файла Simon..14 Общие вопросы C/C++ 8 09.06.2009 10:18