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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 08.10.2009, 20:52   #1
Rustik2
Пользователь
 
Регистрация: 08.10.2009
Сообщений: 14
По умолчанию Как оперативно считать данные из txt файла

Помогите пожалуйста, проблема такая, мне нужно считать данные из txt файла который постоянно пополняется новыми данными. Я могу считать данные лишь на момент открытия этого файла, а новые данные после открытия не считываются. Как мне написать код так чтобы новые данные сразу же отражались в программе.
Rustik2 вне форума Ответить с цитированием
Старый 08.10.2009, 20:58   #2
Rustik2
Пользователь
 
Регистрация: 08.10.2009
Сообщений: 14
По умолчанию

На сегодняшний момент имею код:
#include <iostream.h>
#include <fstream.h>

void main (void)
{
int kol_str = 0;

ifstream file("File.txt");
char line[45];
while (! file.eof())
{
kol_str++;

file.getline(line, sizeof(line));
cout << kol_str;
cout << line << endl;

}
}
Rustik2 вне форума Ответить с цитированием
Старый 09.10.2009, 00:22   #3
m0nax
Форумчанин
 
Аватар для m0nax
 
Регистрация: 25.09.2009
Сообщений: 525
По умолчанию

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

с теми знаниями что у меня есть сейчас я бы попробовал отследить состояние файла, например размер в байтах
если не изменился значит ничего выводить не надо, если изменился вывести что-то
m0nax вне форума Ответить с цитированием
Старый 09.10.2009, 00:50   #4
m0nax
Форумчанин
 
Аватар для m0nax
 
Регистрация: 25.09.2009
Сообщений: 525
По умолчанию

вот примерно так это можно сделать, (это просто пример, под свой код сам правь)
Код:
#include <iostream>
#include <fstream>
#include <string>
#include <windows.h> 
#include <ios> 
using namespace std;

int main()
{
	setlocale(LC_ALL, "Russian");

	ifstream file("1.txt");

	char ch[251]; 
	string str ;
	int size1 =0 ;
	int size2 =0 ;

	while(!file.eof()) //просто выводим содерживое файла
	{ 
	file >> str;
	cout << str << endl ;
	}

	while(1)
	{
	//читаем файл и запоминаем кол-во байт в size1//
	size1 = 0;
	file.clear(); //очищаем буфер(вроде так))
           file.seekg(0, ios::beg); //указатель в начало
	while(!file.eof()) 
	{
	file.read(ch, 250); //читаем
	size1 +=file.gcount() ; // запоминаем сколько байтов вычитали 
	}

   /////
	Sleep(2000); //Задержка, иначе не успеем изменить файл (можно и просто паузу поставить) 
   /////

	//читаем файл еще раз и сохраняем кол-во байт в size2
	size2 =0 ;
	file.clear();
   file.seekg(0, ios::beg);
	while(!file.eof())
	{						
	file.read(ch, 250);
	size2 +=file.gcount() ;
	}
	
	//если кол-во байт не совпадает показыаем содержимое файла
			if (size1!=size2)
			{		
				file.clear();
				file.seekg(0, ios::beg);
				while(!file.eof())
				{			
					file >> str;
					cout << str << endl ;
				}
			}
	}
  file.close();

system("pause");
}
при желании можно очень сильно улучшить это безобразие,разбить на функции, настроить указатели в файле(чтоб выводил только то что добавилось) , алгоритм вообще переделать чтоб в реальном времени считывал и т.д
но мне лень этим заниматься
m0nax вне форума Ответить с цитированием
Старый 09.10.2009, 00:52   #5
oleg kutkov
Unix C++ developer
Форумчанин
 
Аватар для oleg kutkov
 
Регистрация: 16.04.2007
Сообщений: 651
По умолчанию

Так и есть - только циклом. Открыть файл в немонопольном (т.е. что бы другое приложение могло записывать в него) режиме и "бесконечным" циклом читать его, получая свежие данные.
Небольшая задержечка, разумеется, будет.

Код выше

Последний раз редактировалось oleg kutkov; 09.10.2009 в 00:55.
oleg kutkov вне форума Ответить с цитированием
Старый 09.10.2009, 08:38   #6
ds.Dante
Старожил
 
Аватар для ds.Dante
 
Регистрация: 06.08.2009
Сообщений: 2,992
По умолчанию

Такая штука есть в фаре - он обновляет в просмоторщике все изменяемые файлы. По-моему, есть какая-то функция WinAPI, отслеживающая изменения файлов. Но если сложности не нужны, подойдет предложенный вариант.
ds.Dante вне форума Ответить с цитированием
Старый 09.10.2009, 19:10   #7
Rustik2
Пользователь
 
Регистрация: 08.10.2009
Сообщений: 14
По умолчанию

Спасибо всем кто ответил. Час буду переваривать вышеизложенный материал.
Rustik2 вне форума Ответить с цитированием
Старый 09.10.2009, 22:31   #8
m0nax
Форумчанин
 
Аватар для m0nax
 
Регистрация: 25.09.2009
Сообщений: 525
По умолчанию

тот код какой-то слишком враждебный получился, вот нормальный сделал
как раз наткнулся тут на полезную функцию tellg() с помощью которой можно определить размер файла гораздо проще
получилось вот что
Код:
#include <iostream>
#include <fstream>
#include <windows.h>
#include <string> 

using namespace std;

int fileSize(char*) ; 
void showText(char*) ;

void main()
{
	setlocale(LC_ALL,"Russian") ;
	char* fileName = "1.txt" ; 
	int k = 0;
	while(1)
	{
		int x = fileSize(fileName) ;
		Sleep(1000);
		int y = fileSize(fileName) ;
			if(y!=x)
			{	
				k++ ;
				showText(fileName);
				cout << "всего файл изменен: " << k << " раз" << endl ;
			}
	}
	system("pause");
}

int fileSize(char* name)
{
	ifstream file(name) ;
	file.seekg(0, ios::end); 
	int size = file.tellg();
	file.close() ;
	return size ;
}

void showText(char* name)
{
	string str ; 
	system("cls");
	cout << "файл изменен, текущее содержимое: " << endl << endl;
	ifstream file(name) ;
	while(!file.eof())
	{
		getline(file, str);
		cout << str << endl;
	}	
	file.close();
}
m0nax вне форума Ответить с цитированием
Старый 10.10.2009, 12:40   #9
Rustik2
Пользователь
 
Регистрация: 08.10.2009
Сообщений: 14
По умолчанию

Спасибо mOnax, твой первый код мне подходит больше, вот если бы еще он выводил только то что добавилось было бы вообще здорово. И еще вопросик, че-то я недогнал зачем нужен оператор Sleep(2000);
Rustik2 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Динамически считать Данные из файла, и вывести результат в файл StudeHt Паскаль, Turbo Pascal, PascalABC.NET 3 25.05.2009 09:04
Как считать данные с БД в WebBrowser? tsergey Общие вопросы Delphi 14 13.04.2009 03:56
Как считать с txt? GaNDyPaC Общие вопросы Delphi 20 16.01.2009 22:02
Как считать данные из Edit? Svop Компоненты Delphi 11 20.11.2006 16:45
как считать данные с Txt файла? Alar Общие вопросы Delphi 0 29.10.2006 20:12