Проще всего прочитать текстовый файл в строку используя std::getline:
getline(in, s, '\0');
Правда из-за того, что третий аргумент имеет тип charT, а не char_traits<charT>::int_type, и потому приходится использовать '\0', а не ios::traits_type::eof(), такое решение не подходит для текстов, в которых может встречаться '\0'. Кто-нибудь знает свободное от этого ограничения решение?
Здравствуйте, 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) — это
специальное значение, которое возвращают некоторые функции при достижении конца файла.
Здравствуйте, 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>>
Здравствуйте, 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);
"Я женился на первой же женщине, которая обратилась ко мне по мейлу." © Л. Торвальдс
может как нить так
#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'. Кто-нибудь знает свободное от этого ограничения решение?