информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Все любят медГде водятся OGRыПортрет посетителя
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Бэкдор в xz/liblzma, предназначенный... 
 Три миллиона электронных замков... 
 Doom на газонокосилках 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
Дык так как у тебя написано вроде нормально 18.12.02 13:25  Число просмотров: 1769
Автор: 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)
<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-го года) библиотеки там приведен.
1




Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2024 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach