Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Чтени и запись в файл, Выводить что добавили в фай


Автор: iSherhan 19.3.2012, 16:59
Здравствуйте. Подскажите пожалуйста как сделать?

например пишу в файл (текстовый)

Код
ofstream os("c:/text.txt");
ifstream is("c:/text.txt");

while (true)
{

os<<"bla-bla";
sleep(300)
}


/*где то в другом месте программы из другого потока

вот надо построчно считывать вводимый файл
если достигнут конец файла поспать 1 секунду
затем проверить нет ли новых строк. если есть считать их опять
до конца файла и снова уснуть
и т.д
желательно используя ifstream

организовать своего- рода мониторинг добавления строк в файл.


делаю вот так цикле

Код
while (true)
{
std::string s;
is>>s;
std::cout<<s;
sleep(1000);
}


- не работает 

Модератор: Не забываем пользоваться кнопочкой "Код"

Автор: JackYF 19.3.2012, 22:03
Цитата(iSherhan @  19.3.2012,  15:59 Найти цитируемый пост)
- не работает */  

А точнее?

И лучше приведи весь код. Много зависит от того, как организованы потоки и как открывались файлы.

Автор: IBS 19.3.2012, 22:18
Цитата(iSherhan @  19.3.2012,  16:59 Найти цитируемый пост)
если достигнут конец файла поспать 1 секунду

Можно попробовать заключить это дело в еще один while который останавливается также по концу файла, а после внутреннего цикла(со считыванием из файла) сделать sleep

Автор: iSherhan 20.3.2012, 05:16
А можно код
а то делаю вот так 

Код

    std::ifstream is;
    is.open("e:/temp/rw.txt");


    while (true)
    {
       string s;
       is>>s;
       if (s.size()==0) break;
       std::cout<<s;
       sleep(1000);
    }


При добавлении строк в файл из другого места программы
в этом коде не не отображаются добавленные строки

добавляю так
Код

  ofstream os;

  //...........

   os<<"bla-bla 1"<std::endl;
  

  //............

  os<<"bla-bla 21"<std::endl;
  os.flush();
  //и тд




вообще такое возможно с помощью ostream ifstream  ????




Автор: xvr 20.3.2012, 13:41
Цитата(iSherhan @  19.3.2012,  16:59 Найти цитируемый пост)
ofstream os("c:/text.txt");
ifstream is("c:/text.txt");

Работать не будет - вы 2 раза открыли один и тот же файл на чтение и на запись. Последствия непредсказуемые, т.к. у ?stream есть внутренние буфера, которые в данном случае надо явно сбрасывать после каждой записи (и перед каждым чтением). Или отключать буферизацию вообще

Автор: ambler 20.3.2012, 14:12
Код

    while (true)
    {
       string s;
       is>>s;
       if (s.size()==0) break;
       std::cout<<s;
       sleep(1000);
    }

Этот код когда, прочитает все строки выходит из цикла.

Можно сделать так:
отслеживать изменение файла по его атрибутам, считывать из него всю информацию, запоминая кол-во прочитанных байтов, в случае изменения даты модификации, открывать файл, сдвигая позицию чтения, на кол-во прочитанных байт до этого.
Для меж потокового взаимодействия лучше использовать критические секции,  мьютексы.

Автор: ambler 20.3.2012, 15:31
Код

   std::ifstream is;
    is.open("e:/temp/rw.txt");
    while (true)
    {
       string s;
       is>>s;
       if (s.size()==0) break;
       std::cout<<s;
       sleep(1000);
    }


Немного переписал код, с мониторингом добавления строк в файл справляется)
Код

#include <iostream>
#include <fstream>
#include <Windows.h>

using namespace std;

void readFile()
{
    ifstream file;
    file.open("D:\\11.txt");

    if (!file.is_open()) return;

    while(true)
    {
        string tmp;
        file >> tmp;
        if (file.fail())
        {
            Sleep(1000);
            file.clear();
            continue;
        }
        cout << tmp << endl;
    }

    file.close();
}

int main()
{
    readFile();
    return 0;
}

Автор: iSherhan 21.3.2012, 03:08
Cпасибо всем ответившим. Проблема решена. оказалось, что
класс чтения из файла ifstream не хотел дальше читать из файла при достижении конца файла в данный
момент. Но ofstream ведь продолжал добавлять данные.
Вот если ifstream  не доходил до конца а останавливал чтение допустим за одну строку до конца файла,
то далее он читал и добавленные другим файловым потоком строки.
Дело я думаю в установке при достижении конца файла флага ios::eof.
После вызова ifstream::clear()  поток далее читал из файла

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)