Копирование\перенос содежимое файла в список std::list
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.217.20] |
|
|
Копирование\перенос содежимое файла в список std::list
|
Сообщ.
#1
,
|
|
|
|
Всем доброй ночи и с праздником.
OC:Windows 7 Компилятор : Visual Studio C++(win32). Вопрос как перенести \копировать содержимое файла в список std::list. Пишу такую функцию ![]() ![]() void LoadFromFile(LPCSTR fileName) { std::list<std::string> foo; std::list<std::string>::iterator it; std::string stroka; std::ifstream fin; // Открываем файл для обработки fin.open(fileName); if(fin.fail()) { MessageBoxA(0,"не удалось открыть ",fileName, MB_OK); exit(1); } char next; do { fin.get(next); stroka +=next; }while(!fin.eof()); foo.push_back(stroka); //Вывожу список через мессаге for (it=foo.begin(); it!=foo.end(); it++) { stroka = *it; MessageBoxA(0,stroka.c_str(),fileName, MB_OK); } fin.close(); } не достаток этого метода, он переносит весь файл в одной строке, т.е. индекс всегда равен 0 (первая строка) ![]() ![]() void LoadFromFile(LPCSTR fileName) { std::list<std::string> foo; std::list<std::string>::iterator it; std::string stroka; std::ifstream fin; // Открываем файл для обработки fin.open(fileName); if(fin.fail()) { MessageBoxA(0,"не удалось открыть ",fileName, MB_OK); exit(1); } char next; do { fin.get(next); if(next != '\n') stroka +=next; else { stroka +=next; foo.push_back(stroka); } }while(!fin.eof()); //Вывожу список через мессаге for (it=foo.begin(); it!=foo.end(); it++) { stroka = *it; MessageBoxA(0,stroka.c_str(),fileName, MB_OK); } fin.close(); } при таком коде, не заносится последняя строка. Добавлено Компилятор : Visual Studio 8 C++(win32). |
|
Сообщ.
#2
,
|
|
|
|
![]() ![]() std::string line; std::list<std::string> lines; while( getline( file, line ) ) { lines.push_back( line ); } |
|
Сообщ.
#3
,
|
|
|
|
Painkiller
Выдает ошибку ![]() ![]() 1>.\formWin32.cpp(252) : error C2589: }: недопустимая лексема справа от '::' 1>.\formWin32.cpp(252) : error C2143: синтаксическая ошибка: отсутствие ";" перед "::" Вот функция ![]() ![]() void LoadFromFile(LPCSTR fileName) { std::list<std::string> foo; std::list<std::string>::iterator it; std::string stroka; std::ifstream fin; // Открываем файл для обработки fin.open(fileName); if(fin.fail()) { MessageBoxA(0,"не удалось открыть ",fileName, MB_OK); exit(1); } while(std::getline(fin,stroka)) { foo.push_back(stroka); } for (it=foo.begin(); it!=foo.end(); it++) { stroka = *it; MessageBoxA(0,stroka.c_str(),fileName, MB_OK); } fin.close(); } |
|
Сообщ.
#4
,
|
|
|
|
инклюдов не хватает
|
|
Сообщ.
#5
,
|
|
|
|
![]() ![]() #include <iostream> #include <fstream> #include <list> |
|
Сообщ.
#6
,
|
|
|
|
Спасибо. Вопрос решен.
|
|
Сообщ.
#7
,
|
|
|
|
Но возникла вторая прболемаю
Как узнать кодировку файла, при вставке его в буфер? А то я открыл файл, а там крякозябры. Пришлось вручную перекодировать файл в АНСИ, а потом открывать. И стало работать норм. |
|
Сообщ.
#8
,
|
|
|
|
Если можно подскажите в каком направление идти.
|
|
Сообщ.
#9
,
|
|
|
|
Точно узнать кодировку не получится. Можно только пытаться угадать. Делает это, например, библиотека ICU. По-хорошему, если ты работаешь с текстовыми файлами с кодировкой, то тебе должны предоставить о ней инфу, а не ты ее угадывать.
|
|
Сообщ.
#10
,
|
|
|
|
Цитата PropellerMan @ По-хорошему, если ты работаешь с текстовыми файлами с кодировкой, то тебе должны предоставить о ней инфу, а не ты ее угадывать. Просто я пишу парсеры, по логам, сторонних утилит, и у некоторых кодировка разная. А информацию, мне конечно ни кто не дает. |
|
Сообщ.
#11
,
|
|
|
|
Aibolit Никак, у xml информация о кодировке содержится в хидере.
|
|
Сообщ.
#12
,
|
|
|
|
Цитата Painkiller @ Aibolit Никак, у xml информация о кодировке содержится в хидере. Я обычные текстовые файлы, обрабатываю. P.S. Интересно, а когда VSC++ перейдет на обработку, всех кодировок. Embarkadero давно уже поддерживает, практически все коироки. |
|
Сообщ.
#14
,
|
|
|
|
Цитата Aibolit @ Где-то так году в 2000-м. Если ты застрял где-то в прошлом. Интересно, а когда VSC++ перейдет на обработку, всех кодировок. |
|
Сообщ.
#15
,
|
|
|
|
![]() ![]() struct line : public std::string {}; std::istream& operator>> (std::istream& is, line& l) { return std::getline(is, l); } void LoadFromFile(LPCSTR fileName) { std::list<std::string> strlist; std::ifstream in; ... std::copy (std::istream_iterator<line>(in), std::istream_iterator<line>(), std::back_inserter(strlist)); } |
|
Сообщ.
#16
,
|
|
|
|
Цитата trainer @ Где-то так году в 2000-м. Если ты застрял где-то в прошлом. До этого я в Борланде программировал. Недели 2 перешел на VSC++. В борланде когда обрабатывал данный лог, он обработался без проблем. Я даже и не знал, что там кодировка другая. |