Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> работа с текстовыми файлами - нужна помощь, считывать отдельно каждый символ 
V
    Опции темы
Riddik
Дата 10.12.2006, 21:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 598
Регистрация: 2.12.2006

Репутация: нет
Всего: нет



Нужно считывать данные из текстового файла *.txt 

Причём нужно считывать каждый символ, видеть слова, и заносить каждое слово или одиночный символ в массив.(пока одномерный).

Думаю, нужно использовать класс CFile.

Как использовать указатель чтения в файле seek?


Вот

Код

CFile vhodF;
vhodF.Open(put1, CFile::modeRead);
 


в put1 находится полный путь к нужному текстовому файлу.

Дальше как начать считывать данные посимвольно? И заносить в массив? 

Другими словами  не знаю подробного описания работы с CFile и его методами!

Помогите пожалуйста!

PM MAIL   Вверх
zabivator
Дата 10.12.2006, 21:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 171
Регистрация: 7.6.2006
Где: нск

Репутация: 1
Всего: 2



Riddik, CFile лучше не использовать, т.к. этим ты жестко привязываешься к платформе. Лучше посмотри в сторону, например boost::split http://boost.org/doc/html/id2580251.html
Вообще говоря, лучше всего определить оператор
Код

std::istream& operator>>( std::istream& s, std::vector<std::string>& v )
{
std::string str;
s>>str;
v.push_back(str);
return s;
}

использование:
Код

std::vector<std::string> v;
std::ifstream f("filename"/*openmode*/);
while ( !f.eof() ) f>>v;
f.close();

вот и вся реализация!

Это сообщение отредактировал(а) zabivator - 10.12.2006, 21:42
--------------------
#include <zabivator>int main( int, char * [] ){   while( Zabivator::жив() ) Zabivator::моск()++;   return 0;}
PM MAIL WWW ICQ   Вверх
Brain
Дата 10.12.2006, 21:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 49
Регистрация: 10.12.2006
Где: Россия, Новочерка сск

Репутация: нет
Всего: нет



Можно использовать WinAPI:
Код

DWORD nb=0;
HANDLE hFile=CreateFile(strFile,GENERIC_READ,NULL,NULL,OPEN_EXISTING,0,NULL);
int size=LOWORD(GetFileSize(hFile,0));
ReadFile(hFile,str,size,&nb,0);

strFile - строка,путь к файлу
str - массив, здесь будут лежать символы


PM MAIL ICQ   Вверх
zabivator
Дата 10.12.2006, 22:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 171
Регистрация: 7.6.2006
Где: нск

Репутация: 1
Всего: 2



Brain, кошмар какой.
--------------------
#include <zabivator>int main( int, char * [] ){   while( Zabivator::жив() ) Zabivator::моск()++;   return 0;}
PM MAIL WWW ICQ   Вверх
Riddik
Дата 10.12.2006, 22:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 598
Регистрация: 2.12.2006

Репутация: нет
Всего: нет



Спасибо, но в данном случае вопрос о кроссплатформенности не стоит, можно вполне использовать CFile, прога делается на Visual C++ с использованием MFC.

И можно, пожалуйста, попроще, я не настолько ещё осволся, чтобы понять например в данном случае 

std::istream& operator>>( std::istream& s, std::vector<std::string>& v ) и т.д.?


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




 
PM MAIL   Вверх
zabivator
Дата 10.12.2006, 22:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 171
Регистрация: 7.6.2006
Где: нск

Репутация: 1
Всего: 2



Riddik, ок, сейчас напишу по пунктам.
Прежде всего - для каждой задачи нужно использовать наиболее декватный инструмент. В данном случае stl будет использовать проще, короче, и... более правильно, с точки зрения "хорошего" стиля.
Код

// перегружаем (  значении - переопределяем )оператор >> . Параметры у него, как видишь - std::istream& ( сюда передается то, что слева от >>, в примере использования выше - это объект класса std::ifstream - файлового потока, который является потомком ( унаследован от ) std::istream, а std::vector<std::string>& - наш массив, в который хотим считать слова.
std::istream& operator>>( std::istream& s, std::vector<std::string>& v )
{
//объявили строку
std::string str;
//читаем в строку из потока. потоки устроены так, что считают как раз "слово" - все символы, до символа пробела, табуляции или перевода строки.
s>>str;
//Засовываем строку в массив
v.push_back(str);
// мы возвращаем ссылку на поток. Такой прием позволяет написать что-нить типа: f>>v>>v2, т.е. последовательно записать несколько таких вызовов;
return s;
}

В твоем случае, если тебе нужно составить таблицу идентификаторов, нужно вместо std::vector использовать std::set, или std:map<std::string,unsigned> - если нужен подсчет встреченных слов.
--------------------
#include <zabivator>int main( int, char * [] ){   while( Zabivator::жив() ) Zabivator::моск()++;   return 0;}
PM MAIL WWW ICQ   Вверх
Brain
Дата 10.12.2006, 22:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 49
Регистрация: 10.12.2006
Где: Россия, Новочерка сск

Репутация: нет
Всего: нет



Если нада использовать CFile:

CFile.Read(buf,count);

buf - куда записывать символы
count - скока символов считать
Если тебе надо посимвольно считывать, то count = 1, если нада пословесно, то считывай в цыкле посимвольно пока не найдешь пробел. Так помойму легче.

Цитата

Brain, кошмар какой.

zabivator, что не нравится?

PM MAIL ICQ   Вверх
zabivator
Дата 10.12.2006, 22:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 171
Регистрация: 7.6.2006
Где: нск

Репутация: 1
Всего: 2



Brain, исспользование платформенно-зависимого апи в задаче, которая решается использованием стандартных средств языка - имхо, извращение.
Цитата

Думаю, нужно использовать класс CFile.

автор подчеркнул, что он так думает, а не нужно так сделать.
К тому же если реализация на стандартных stl-потоках уместилась в пять строчек ( которые приведены мною выше ) через api всяко будет больше гемора, и больше риск возникновения ошибок.

Это сообщение отредактировал(а) zabivator - 10.12.2006, 22:38
--------------------
#include <zabivator>int main( int, char * [] ){   while( Zabivator::жив() ) Zabivator::моск()++;   return 0;}
PM MAIL WWW ICQ   Вверх
Brain
Дата 10.12.2006, 22:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 49
Регистрация: 10.12.2006
Где: Россия, Новочерка сск

Репутация: нет
Всего: нет



Если нормально знать(понимать) апи то никакого гемора не буедт, ошибок тоже. Я, например, всю жизнь пишу на апи и мне нравится.
ЗЫ: О вкусах не спорят.
PM MAIL ICQ   Вверх
zabivator
Дата 10.12.2006, 22:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 171
Регистрация: 7.6.2006
Где: нск

Репутация: 1
Всего: 2



Brain, дело не во вкусах, а в адекватности выбора инструмента для решения задачи.
К тому же мне интересно, как ты будешь использовть апи вместе с алгоритмами стандартной библиотеки. Я думаю, правилен один из вариантов:
1) Пишешь велосипеды вместо использования stl
2) Пишешь обертки над апи
--------------------
#include <zabivator>int main( int, char * [] ){   while( Zabivator::жив() ) Zabivator::моск()++;   return 0;}
PM MAIL WWW ICQ   Вверх
Riddik
Дата 10.12.2006, 23:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 598
Регистрация: 2.12.2006

Репутация: нет
Всего: нет



Спасибо большое!!! и  zabivatorу, и Brainу!!! 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1270 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.