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


Автор: OPQ 16.4.2007, 14:39
В файле test.txt записано: qwerty
я его считываю и получаю qwertyy

делаю так
Код

char ch;
    ifstream intxtfile("test.txt");
    while(intxtfile)
    {
        intxtfile.get(ch);
        cout<<ch;
    }


Подскажите где я ошибся.

Автор: fantast 16.4.2007, 14:49
Цитата(OPQ @  16.4.2007,  14:39 Найти цитируемый пост)
while(intxtfile)

такая запись означает что цикл будет продолжаться до тех пор пока биты ошибок пусты, т.е. ошибок пока не происходило.
когда ты считываешь последний символ и оказываешься в конце файла, то ошибок все еще не было, поэтому цикл повторяется еще раз и в нем ты пытаешься считать символ из файла, это у тебя не удается (получается ошибка), и ты выводишь содержимое ch которое соответственно не изменилось, и только после этого твоя запись while(intxtfile) позволит тебе выйти из цикла. тут тебе лучше использовать eof().

Автор: OPQ 16.4.2007, 14:54
fantast,  всё равно тоже самое
Код

while(!intxtfile.eof())
{
    intxtfile.get(ch);
    cout<<ch;
}

Автор: JAnty 16.4.2007, 14:55
fantast логично сказано, кончно надо ловить eof.

Автор: Anikmar 16.4.2007, 14:58
Предположение:
Помню под ДОС текстовые файлы заканчивались симолом ^Z.
А как сейчас даже не знаю. Может он его хавает? Или там пустая строка есть...

Автор: JAnty 16.4.2007, 14:59
Цитата(OPQ @  16.4.2007,  14:54 Найти цитируемый пост)
fantast,  всё равно тоже самое


Чисай Сишными методами и всё будет ОКеюшки... smile 

Автор: OPQ 16.4.2007, 15:00
Anikmar, пустой строки нет

Автор: JAnty 16.4.2007, 15:01
Символ конца строки равен 255. Но это не главное.

Читай fscanf'ом

Автор: OPQ 16.4.2007, 15:02
Цитата(JAnty @  16.4.2007,  14:59 Найти цитируемый пост)
Чисай Сишными методами и всё будет ОКеюшки...   

пример можно, а то я не знаю как. Но лучше всёже при помощи потоков...

Автор: fantast 16.4.2007, 15:04
черт попутал, в ошибочных битах тож есть бит eof, так что должно было работать..
а выложи всю программу

Автор: OPQ 16.4.2007, 15:07
fantast, 
Код

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

using namespace std;
int main()
{
    
    char ch;
    ifstream intxtfile("test.txt");
    
    while(intxtfile)
    {
        intxtfile.get(ch);
        cout<<ch;
    }
    cout<<'\n';
    while (!_getch()); 


    return 0;
}

Автор: vinter 16.4.2007, 15:15
Код

 while(!intxtfile.eof())
    {
        intxtfile.get(ch);
        cout<<ch;
    }

если компилятор от горячо любимого борланда, то косяк все равно может остаться.

Автор: fantast 16.4.2007, 15:18
переделай свой txt файл, мот ты там какой пробел поставил после цифр или еще что..

Автор: OPQ 16.4.2007, 15:19
vinter,делал я так smile 

Цитата(vinter @  16.4.2007,  15:15 Найти цитируемый пост)
если компилятор от горячо любимого борланда, то косяк все равно может остаться. 

VC++ 2005, VC++ 2002

Автор: dumb 16.4.2007, 15:23
Цитата(vinter @  16.4.2007,  15:15 Найти цитируемый пост)
если компилятор от горячо любимого борланда, то косяк все равно может остаться

горячо любимый борланд тут не причем. состояние потока нужно проверять после чтения, а не где удобней.
либо:
Код

    while(intxtfile >> ch)
    {
        cout<<ch;
    }


либо:
Код

        if (intxtfile.get(ch))
          cout<<ch;

Автор: betal 16.4.2007, 15:25
Код

#include <iostream>
#include <fstream>
#include <conio.h>
int main()
{    int dlina_key=-1;
char m;
char*keys;
        FILE*f= fopen("test.txt","rb");
            while (fscanf(f,"%c",&m)!=EOF) 
            {
            ++dlina_key;    
                printf("%c",m);
            }
            rewind (f);
            keys = new char[dlina_key];
                        fread(keys,sizeof(char),dlina_key,f);
            fclose(f);    
}

 smile 

Автор: fantast 16.4.2007, 15:26
у меня все равотает на ура 

Автор: betal 16.4.2007, 15:27
дя и чуть было н забыл прибить нужно  выдилиную дин.память

Автор: JAnty 16.4.2007, 15:27
Вот решение, на моё удевление  и сишный метод также ошибается.
Код

   while(true)
    {

        intxtfile.get(ch);
       if(intxtfile.eof())break;
        cout<<ch;
    }


Добавлено через 2 минуты и 19 секунд
betal  мда...

Автор: betal 16.4.2007, 15:34
Цитата(JAnty @  16.4.2007,  15:27 Найти цитируемый пост)
betal  мда... 

 smile 

Автор: OPQ 16.4.2007, 15:34
спасибо, помогло вот это
Код

while(intxtfile)
{        
        if (intxtfile.get(ch))
            cout<<ch;
}


теперь вопрос такой: как это записать в другой файл test2.txt

Автор: fantast 16.4.2007, 15:35
да блин если пишите на си++ так пишите на си++, а не функция отсюда, функция оттуда  smile 

Автор: JAnty 16.4.2007, 15:37
Лучше писть на С
имхо

Автор: fantast 16.4.2007, 15:37
Цитата(OPQ @  16.4.2007,  15:34 Найти цитируемый пост)
теперь вопрос такой: как это записать в другой файл test2.txt

открываешь и записываешь!

Автор: betal 16.4.2007, 15:38
Код

 FILE *K;
    K=fopen("test2.txt","wb+");
        fprintf(K,"%s ",t_key); ///твой массив t_key
    fclose(K);
 smile

Добавлено через 1 минуту и 13 секунд
Цитата(fantast @  16.4.2007,  15:35 Найти цитируемый пост)
да блин если пишите на си++ так пишите на си++, а не функция отсюда, функция оттуда  smile 
что есть на том и пишу smile 

Автор: fantast 16.4.2007, 15:40
Код

.....
ifstream     intxtfile("test.txt");
ofstream outtxtfile("test2.txt");
while(intxtfile)
{        
        if (intxtfile.get(ch))
           { cout<<ch;outtxtfile<<ch;}
}


Автор: JAnty 16.4.2007, 15:40
%s откуда, если мы читали по %с?

Автор: betal 16.4.2007, 15:43
тфу ты. Ну то машинально  smile 
Да JAnty совершенно вегно....

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