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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с файловым потоком 
:(
    Опции темы
kleks
Дата 26.10.2005, 00:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Имеется текстовый файл след. содержания (в качестве примера):
12
34

56
Необходимо написать программу читающую данный файл, игнорируя пустые строки!!!!!
Вот что у меня получилось:
Код

#include "iostream.h"
#include "stdafx.h"
#include "fstream.h"
#include "stdlib.h"
#include "string.h"
void main()
{
    const int lenString=60;//длина вспомагательного массива
    ifstream inFile; //файловый поток
    inFile.open ("1.txt"); //открыть файл и связать его с потоком
 if (!inFile)
 {
     cout<<"Oshibka pri otkrite file!!";
     exit(1);
 }

char buf[lenString]; //вспомаг. массив для чтения
char next;
cin.get(); //уберает код из потока cin
do 
{
    inFile.getline(buf,lenString);
    int s=strlen(buf);
    char *str=new char[s+1];
    strcpy (str,buf);
    next=inFile.peek(); //проверка след. символа
    if (next=='\n') 
    {
        inFile.ignore(next);
        long poz=inFile.tellg();
        inFile.seekg(poz);
    }
    cout<<str<<'\n';
}
while (next!=EOF);

}


Но у меня почему-то выводит:
12
34 и всё!!!!
Подскажите пожалуйста в чем ошибка?! smile Заранее благодарен!!!!

PM MAIL   Вверх
LPBOY
Дата 26.10.2005, 00:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Проще сделать так:
Код

#include <iostream>

using namespace std;

#define SIZE(x) sizeof(x)/sizeof(x[0])

int main()
{
    ifstream infile("1.txt");
    if (!infile)
    {
     cout<<"Cannot open file";
     return 1;
    }
    char buf[60];
    while(infile.getline(buf, SIZE(buf)))
    {
        if(buf[0] == 0) continue;
        cout << buf << endl;
    }
    return 0;
}

--------------------
Каждый человек по-своему прав, а по-моему нет...
PM MAIL   Вверх
comcon1
Дата 26.10.2005, 13:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 11.6.2005
Где: Москва ДАС-МГУ

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



Getline -- вообще странная функция.
смотри напр. тему -- еще одна тема по поводу getline()


--------------------
PM MAIL   Вверх
S.A.P.
Дата 26.10.2005, 15:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Код

#include <fstream>
#include <iostream>
#include <conio.h>

using namespace std;

int main(int argc, char *argv[])
{
    ifstream inFile( "1.txt" );
    string buf;
    while ( !inFile.eof() ) {
        inFile >> buf;
        cout << buf << endl;
    }
    getch();
}


Это сообщение отредактировал(а) Perchilla - 26.10.2005, 15:25
PM MAIL   Вверх
LPBOY
Дата 26.10.2005, 15:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(Perchilla @ 26.10.2005, 15:21)

Код

#include <fstream>
#include <iostream>
#include <conio.h>
using namespace std;
int main(int argc, char *argv[])
{
    ifstream inFile( "1.txt" );
    string buf;
    while ( !inFile.eof() ) {
        inFile >> buf;
        cout << buf << endl;
    }
    getch();
}


Ошибка номер раз: ты не проверил открыт ли файл.
Ошибка номер два: while ( !inFile.eof() ) - так писать нельзя!
Может привести к бесконечному циклу. Если произойдет ошибка чтения - eofbit не установится никогда. Кстати, это может случиться из-за ошибки открытия файла, которую ты не обработал smile
ИМХО, лучше уж так:
Код

#include <fstream>
#include <iostream>
#include <conio.h>
#include <string>
using namespace std;
int main(int argc, char *argv[])
{
    ifstream inFile( "1.txt" );
    if(!inFile)
    {
        cout << "Ошибка" << endl;
        return 1;
    }
    string buf;
    while ( inFile >> buf )        
        cout << buf << endl;
    getch();
}


Это сообщение отредактировал(а) LPBOY - 26.10.2005, 15:59
--------------------
Каждый человек по-своему прав, а по-моему нет...
PM MAIL   Вверх
pablo
Дата 26.10.2005, 16:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 320
Регистрация: 12.2.2005
Где: Вильнюс, Литва

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



а ещё лучше вместо
Цитата
!inFile
написать
Цитата
inFile.fail()
или
Цитата
inFile::failbit


С точки зрения производительности это одинакого, но понятнее для новичка.


--------------------
Первый блин всегда похож на сферу, иногда бывает и куб.
PM MAIL ICQ   Вверх
S.A.P.
Дата 26.10.2005, 16:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



LPBOY это я для примера привел, чтобы с getline не возиться. Разумеется при условии, что там пробелов нет.

PS: Че все меня на мелочах ловят? smile
PM MAIL   Вверх
kleks
Дата 26.10.2005, 22:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



LPBOY Спасибо, то что нужно!!!! Вроде всё понятно, кроме одной строчки:
Код

using namespace std;

Что она делает!?
PM MAIL   Вверх
Kagor
Дата 26.10.2005, 22:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Debian user
****


Профиль
Группа: Экс. модератор
Сообщений: 2946
Регистрация: 28.2.2003
Где: Королевство Кривых

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



Цитата(kleks @ 26.10.2005, 23:22)
LPBOY Спасибо, то что нужно!!!! Вроде всё понятно, кроме одной строчки:
Код

using namespace std;

Что она делает!?

Эта директива включает пространство имен библиотеки STL.


--------------------
Disassemble Your life and get the key!
PM ICQ GTalk Jabber   Вверх
LPBOY
Дата 26.10.2005, 22:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(kleks @ 26.10.2005, 22:22)
Что она делает!?

Как уже сказали

Цитата(Kagor @ 26.10.2005, 22:39)
Эта директива включает пространство имен библиотеки STL.


Эта директива нужна чтобы каждый раз не писать std::cout, std::ifstream и т.д. Хотя как я вижу твой компилятор и без этой директивы позволяет так писать...
Добавлено @ 22:49
Цитата(Perchilla @ 26.10.2005, 16:30)
PS: Че все меня на мелочах ловят? smile

Я не ловлю тебя - просто высказал свое мнение, это все-таки форум smile
--------------------
Каждый человек по-своему прав, а по-моему нет...
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.0509 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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