Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Проблема с файловым потоком


Автор: kleks 26.10.2005, 00:00
Имеется текстовый файл след. содержания (в качестве примера):
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 Заранее благодарен!!!!

Автор: LPBOY 26.10.2005, 00:43
Проще сделать так:
Код

#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;
}

Автор: comcon1 26.10.2005, 13:12
Getline -- вообще странная функция.
смотри напр. тему -- http://forum.vingrad.ru/index.php?showtopic=4555&hl=

Автор: S.A.P. 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();
}

Автор: LPBOY 26.10.2005, 15:58
Цитата(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();
}

Автор: pablo 26.10.2005, 16:05
а ещё лучше вместо
Цитата
!inFile
написать
Цитата
inFile.fail()
или
Цитата
inFile::failbit


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

Автор: S.A.P. 26.10.2005, 16:30
LPBOY это я для примера привел, чтобы с getline не возиться. Разумеется при условии, что там пробелов нет.

PS: Че все меня на мелочах ловят? smile

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

using namespace std;

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

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

using namespace std;

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

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

Автор: LPBOY 26.10.2005, 22:44
Цитата(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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)