информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Spanning Tree Protocol: недокументированное применениеПортрет посетителя
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Ядро Linux избавляется от российских... 
 20 лет Ubuntu 
 Tailscale окончательно забанила... 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





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




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


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