Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
| |
В смысле??? 18.12.02 03:24 Число просмотров: 1776
Автор: alien <Андрей> Статус: Member
|
Что ты подразумеваешь под стандартной библиотекой?
|
<programming>
|
[C++] Проблема с потоками в C++ 17.12.02 07:41
Автор: alien <Андрей> Статус: Member
|
Привет!
Такая проблема: при чтении текстового файла (лог Squid'a) при помощи потоков С++ поток встает колом, а конкретно - не перемещается указатель текущей позиции. Вот сам код:
#include <iostream.h>
#include <fstream.h>
int main ()
{
ifstream f ("some_file");
if (!f)
{
cerr << "Ошибка открытия файла!!!" << endl;
exit(1);
}
char str[2048];
while (f.getline(str, 2048))
{
//обработка строки str
}
f.seekg(0, ios::end);
cout << "Текущая позиция в файле : " << f.tellg() << endl;
}
Так вот, если убрать строку f.seekg(0, ios::end); , то tellg() возвращает -1. Если строку оставить, то происходит то же самое. Попытка вставить в условие выхода из цикла !f.eof() , а само чтение строки перенести в тело цикла не принесло успеха.
Что самое удивительное, этот код работает с небольшими файлами в несколько килобайт, но при попытке работать с файлами размером в несколько мегабайт возникают вышеописанные ошибки. Пробовал эту прогу на Borland c++ 3.1 (старенький досовский компилятор) - работает нормально! C++ Builder 6 - ошибка.
Я компилирую gcc 3.2 (ОС Mandrake Linux 9.0).
|
|
Было уже 17.12.02 14:07
Автор: amirul <Serge> Статус: The Elderman
|
> char str[2048]; > while (f.getline(str, 2048)) > { > //обработка строки str > }
Когда поток переходит в состояние, отличное от good (пишу по памяти, но кажется это eof, bad и fail), то любые операции с ним ошибочны. Для продолжения работы нужно сбросить состояние потока: f.clear();
При этом позиционироваться в конец не нужно - указатель и так там.
|
| |
Было уже 18.12.02 03:14
Автор: alien <Андрей> Статус: Member
|
То что поток переходит в состояние ошибки - и так понятно. Как корректно прочитать файл построчно?
|
| | |
Дык так как у тебя написано вроде нормально 18.12.02 13:25
Автор: amirul <Serge> Статус: The Elderman
|
> То что поток переходит в состояние ошибки - и так понятно. > Как корректно прочитать файл построчно?
ifstream f("filename");
char s[1024];
while (f.getline(s, sizeof(s))) {
// ...
}
но лучше
ifstream f("filename");
string s;
while (getline(f, s)) {
// ...
}
string сам следит за тем, чтоб все помещалось.
А перед seekg следует сделать clear().
И если уж быть совсем точным, то переходит не в состояние ошибки, а в состояние конец_файла (включается не badbit, а eofbit)
|
|
[C++] Проблема с потоками в C++ 17.12.02 09:59
Автор: BioHazard <bio> Статус: Elderman
|
> Такая проблема: при чтении текстового файла (лог Squid'a) > при помощи потоков С++ поток встает колом, а конкретно - не > перемещается указатель текущей позиции. Вот сам код:
юзай стандартные библиотеку:
<iostream>
<string>
typedef std::map<std::string, std::string> STR2STR;
STR2STR conf;
void ReadFile(std::string confName, STR2STR& conf)
{
std::string str, variable, value;
std::ifstream File(confName.c_str());
while(!File.eof()) {
std::getline(File, str);
variable = str.substr(str.find_first_not_of(' '), str.find('=')-str.find_first_not_of(' '));
value = str.substr(str.rfind('=')+1, str.length()-str.rfind('='));
conf[variable] = value;
}
}
|
| |
В смысле??? 18.12.02 03:24
Автор: alien <Андрей> Статус: Member
|
Что ты подразумеваешь под стандартной библиотекой?
|
| | |
Стандарт 98-го года от ISO/IEC 18.12.02 13:12
Автор: amirul <Serge> Статус: The Elderman
|
Короче, вкратце инклудить без .h
#include <iostream>
#include <string>
ну а пример работы со строками методами стандартной (98-го года) библиотеки там приведен.
|
|
|