Форум программистов, компьютерный форум CyberForum.ru

Как регулярно считывать последнюю строку в файле - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Заменить все пробелы на запятые, а запятые на точки. Посчитать количество запятых во введенной строке http://www.cyberforum.ru/cpp-beginners/thread993162.html
Во введенной строке заменить все пробелы на запятые, а запятые на точки. Посчитать количество запятых во введенной строке. Нужно написать программу. Заранее благодарен.
C++ Построить алгоритм декодирования сообщений закодированных кодом простым повторением Построить алгоритм декодирования сообщений закодированных кодом простым повторением. Можете объяснить что от меня хотят, или как его написать? http://www.cyberforum.ru/cpp-beginners/thread993153.html
C++ Программа по классам. Вообще ничего не получается, хотя с виду все просто
Создать класс «арифметическое выражение» с компонентными данными: 1-й аргумент, 2-й аргумент, знак арифметического выражения (перечислимого типа – ‘+’, ‘–‘, ’*’, ‘/’). Определить компонентные функции: получение каждого элемента класса по отдельности, изменение значения операндов, вычисление значения выражения, вывод на экран в формате «арг1 операция арг2 = результат».
Создать массив с рядка символов. Найти дисперсию элементов этого массива. Сформировать новый массив C++
Создать массив с рядка символов. Найти дисперсию элементов этого массива. Сформировать новый массив, вставив среднее арифметическое в средину массива.Удалить заданое количество символов, начиная с заданой позиции.
C++ Построение ДПСД http://www.cyberforum.ru/cpp-beginners/thread993107.html
Может кто, пожалуйста, помочь нарисовать диаграмму перехода состояний действий (ДПСД)? Нарисовал уже ДПС(диаграмму перехода событий) и Информационную модель, как теперь перейти к ДПСД?
C++ Матрицы. Выделяя на главной диагонали последовательно по одному элементу Aii, можно получить n матриц, ограниченных элементами Решить задачу, используя функцию. Дана квадратная целочисленная матрица А порядка n. Выделяя на главной диагонали последовательно по одному элементу Aii, можно получить n матриц, ограниченных элементами A11 и Аii. Программа должна сформировать вектор, элементами которого являются наибольшие элементы всех таких матриц. Функция должна возвращать значение наибольшего элемента в матрице... подробнее

Показать сообщение отдельно
florgas
5 / 4 / 0
Регистрация: 28.09.2010
Сообщений: 339
01.11.2013, 21:42  [ТС]     Как регулярно считывать последнюю строку в файле
Цитата Сообщение от DiffEreD Посмотреть сообщение
Могу предложить такое решение (с использованием boost):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#include <iostream>
#include <iterator>
#include <fstream>
#include <vector>
#include <string>
#include <algorithm>
#include <thread>
#include <chrono>
#include <cstdlib>
#include <conio.h>
#include <boost/filesystem/operations.hpp>
#include <boost/filesystem/path.hpp>
#include <boost/algorithm/string.hpp>
#include <windows.h>
 
namespace fs = boost::filesystem;
using input = std::istreambuf_iterator<char>;
 
int main()
{
   SetConsoleCP (1251); SetConsoleOutputCP (1251);
 
   fs::path path("D:/file.txt");
   if(!fs::is_regular_file(path))
   {
      std::cout << "Файла не существует или неверно задано его имя!" << std::endl;
      return EXIT_FAILURE;
   }
 
   std::ifstream ifs(path.string());
   if(!ifs.is_open())
   {
      std::cout << "Не удалось открыть файл для чтения!" << std::endl;
      return EXIT_FAILURE;
   }
 
   auto last_modified = fs::last_write_time(path);
 
   std::vector<std::string> lines;
   std::string text{input(ifs), input()};
   auto pos = ifs.tellg();
   ifs.close();
 
   boost::split(lines, text, boost::is_any_of("\n"), boost::token_compress_on);
   for(std::string& s : lines) std::cout << s << std::endl;
 
   std::vector<std::string> new_lines;
 
   while(true)
   {
      //ждем 5 секунд и проверяем не изменился ли файл:
      std::this_thread::sleep_for(std::chrono::seconds(5));
      if(last_modified != fs::last_write_time(path))
      {
         last_modified = fs::last_write_time(path);
         std::cout << "\n***** Файл был изменен. *****\n" << std::endl;
         ifs.open(path.string());
         ifs.seekg(pos);
         text.assign((input(ifs)), input()).erase(0, 1); //erase удаляет первый '\n'
         pos = ifs.tellg();
         ifs.close();
         std::cout << text << std::endl;
         boost::split(new_lines, text, boost::is_any_of("\n"), boost::token_compress_on);
 
         std::copy(new_lines.begin(), new_lines.end(), std::back_inserter(lines));
      }
      if(kbhit())
         break;
   }
 
   std::cout << "\n\n\n***** Все строки: *****" << std::endl;
   for(std::string& s : lines) std::cout << s << std::endl;
 
   return 0;
}
Это все хорошо, но слишком сложно. Можно проще: считывать постоянно последнюю строку в файле и проверять ее с последней строкой в файле, которая была записана ранее в отдельную строку. Если строка изменила, т.е. стала не равна, то файл изменился.
Вопрос лишь в том, как прочитать конкретно последнюю строку?
 
Текущее время: 03:20. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru