Как прочитать текстовый файл в строку
От: igna Россия  
Дата: 20.07.08 09:18
Оценка:
Проще всего прочитать текстовый файл в строку используя std::getline:

    getline(in, s, '\0');


Правда из-за того, что третий аргумент имеет тип charT, а не char_traits<charT>::int_type, и потому приходится использовать '\0', а не ios::traits_type::eof(), такое решение не подходит для текстов, в которых может встречаться '\0'. Кто-нибудь знает свободное от этого ограничения решение?
Re: Как прочитать текстовый файл в строку
От: vlad.jun.dev  
Дата: 20.07.08 14:02
Оценка:
Здравствуйте, igna, Вы писали:

I>Проще всего прочитать текстовый файл в строку используя std::getline:


I>
I>    getline(in, s, '\0');
I>


I>Правда из-за того, что третий аргумент имеет тип charT, а не char_traits<charT>::int_type, и потому приходится использовать '\0', а не ios::traits_type::eof(), такое решение не подходит для текстов, в которых может встречаться '\0'.

Тогда это будет уже не совсем текстовый файл.

I>Кто-нибудь знает свободное от этого ограничения решение?

Дело в том, что текстовые файлы не оканчиваются символом ios::traits_type::eof(). Eof (или -1) — это специальное значение, которое возвращают некоторые функции при достижении конца файла.
Re: Как прочитать текстовый файл в строку
От: Константин Б. Россия  
Дата: 20.07.08 15:01
Оценка:
Здравствуйте, igna, Вы писали:

I>Проще всего прочитать текстовый файл в строку используя std::getline:


I>
I>    getline(in, s, '\0');
I>


I>Правда из-за того, что третий аргумент имеет тип charT, а не char_traits<charT>::int_type, и потому приходится использовать '\0', а не ios::traits_type::eof(), такое решение не подходит для текстов, в которых может встречаться '\0'. Кто-нибудь знает свободное от этого ограничения решение?


Использовать другой делимитер который в файле не встречается. Если могут встречаться любые символы, то очевидно считать весь файл за один вызов getline не получится.
... << RSDN@Home 1.2.0 alpha 4 rev. 1096>>
Re: Как прочитать текстовый файл в строку
От: Centaur Россия  
Дата: 20.07.08 16:50
Оценка: 5 (2)
Здравствуйте, igna, Вы писали:

I>Проще всего прочитать текстовый файл в строку используя std::getline:


I>    getline(in, s, '\0');

I>Правда из-за того, что третий аргумент имеет тип charT, а не char_traits<charT>::int_type, и потому приходится использовать '\0', а не ios::traits_type::eof(), такое решение не подходит для текстов, в которых может встречаться '\0'. Кто-нибудь знает свободное от этого ограничения решение?

Во-первых, вызывает сомнение целесообразность чтения текстового файла в строку вообще. Текстовые файлы иногда попадаются неожиданно длинные.

Во-вторых, как уже говорили, файл с \0 — уже не вполне текстовый.

В-третьих:
std::istreambuf_iterator<char> begin(in), end;
std::string s(begin, end);
Re: Как прочитать текстовый файл в строку
От: varnie  
Дата: 21.07.08 00:27
Оценка: 6 (1)
была очень похожая тема:
http://www.rsdn.ru/Forum/message/1186457.flat.aspx
Автор: Ignoramus
Дата: 23.05.05
"Я женился на первой же женщине, которая обратилась ко мне по мейлу." © Л. Торвальдс
Re: Как прочитать текстовый файл в строку
От: codelord  
Дата: 21.07.08 07:15
Оценка: 2 (1)
может как нить так

#include <stdio.h>
#include <sstream>
#include <iostream>
#include <string>
#include <new>

long get_file_size( const char * filename ) //для функции ниже
{
    FILE *fp = fopen( filename, "rb" );
    if ( !fp )
    {
        return 0;
    }
    long res;
    fpos_t position;

    if ( fgetpos(fp, &position) )       //запоминаем текущую позицию
    {
        fclose(fp);
        return -1;
    }        //ошибка получения текущей позиции файла

    fseek(fp, 0, SEEK_END);          //смещаемся в конец файла
    res = ftell(fp);                 //читаем положение указателя в конце файла

    if ( fsetpos(fp, &position) )       //кладем откуда взяли (позицию файла)
    {
        fclose(fp); 
        return -1;
    }        //ошибка установки позиции файла

    fclose(fp);
    return res;
}


std::string file_to_string( std::string filename )
{
    std::string::size_type len = get_file_size( filename.c_str() );
    std::ifstream infile( filename.c_str() );

    if ( !infile || infile.eof() )
    {
        std::cerr << "can't open file " << filename << std::endl;
        exit( 1 );
    }
    char *buf = new char[ len+1 ];
    infile.read(  buf, len );
    buf[len]  = '\0';

    std::stringstream fl;
    fl << buf;
    delete [] buf;
    return fl.str();
}


Здравствуйте, igna, Вы писали:

I>Проще всего прочитать текстовый файл в строку используя std::getline:


I>
I>    getline(in, s, '\0');
I>


I>Правда из-за того, что третий аргумент имеет тип charT, а не char_traits<charT>::int_type, и потому приходится использовать '\0', а не ios::traits_type::eof(), такое решение не подходит для текстов, в которых может встречаться '\0'. Кто-нибудь знает свободное от этого ограничения решение?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.