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

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - 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,322
По умолчанию

Интернет подсказывает:
Код:
    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
Сообщений: 980
По умолчанию

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,322
По умолчанию

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