anonymous
написал 5 апреля 2005 года в 20:22 (2469 просмотров)
Ведет себя
неопределенно; открыл 1814 темы в форуме, оставил 5575 комментариев на сайте.
При чтении данных из файла в строку buf в неё печатаются ещё какие-то символы, которых нет в файле:
Исходная строка в файле: akjdlhfajfdhkjfhalksdjfahlskdfj
Строка buf: akjdlhfajfdhkjfhalksdjfahlskdfj ИЬ@
Вот кусок текста проги:
char *cp;
ifstream in(argv[1],ios::in | ios::binary);
if (!in){
cerr<<"Cannot open «<<argv[1]<<endl;
exit(1);}
do {
if (in.eof()) cp = '\0\′;
else cp=in.get();
i++;}
while (!in.eof());
in.close();
Как сделать так, чтобы buf содержала только оригинальную строку? (Копировать нужно именно посимвольно, чтобы читать файл любой длины).
Последние комментарии
- OlegL, 17 декабря 2023 года в 15:00 → Перекличка 21
- REDkiy, 8 июня 2023 года в 9:09 → Как «замокать» файл для юниттеста в Python? 2
- fhunter, 29 ноября 2022 года в 2:09 → Проблема с NO_PUBKEY: как получить GPG-ключ и добавить его в базу apt? 6
- Иванн, 9 апреля 2022 года в 8:31 → Ассоциация РАСПО провела первое учредительное собрание 1
- Kiri11.ADV1, 7 марта 2021 года в 12:01 → Логи catalina.out в TomCat 9 в формате JSON 1
ecobeing.ru
Экология и вегетарианство на благо всем живым существам Планеты.
Предлагаю оптимизировать цикл:
while (!in.eof())
{
cp=in.get();
i++;
}
cp = '\0\′;
и попробовать читать файл как текстовый.
Под cp выделена память?
а обнулять выделенную память кто будет?
Вообще раз уж это C++, то лучше что-то вроде (чтение всего файла в строку разом)
Хотя посимвольное чтение с точки зрения производительности не очень…
Кроме того я не понял Вашу фразу о чтении файла любой длины…
Обычно, если файл очень большой и его не хотят грузить в буфер используют mmap или чтение в буфер фиксированной длины (getline метод).
Кстати проблема Вашего кода в том, что Вы не проверяете состояние потока
после get
Будет работать.
Удачи
— sas
Да проще всего сделать так:
man mmap ;)
Попробовал вариант:
ifstream f( «test.txt» );
if ( f.good ) {
f.unsetf( ios_base::skipws );
string buf( istream_iterator( f ), istream_iterator() );
cout << «Got [" << buf << "]\n»;
}
Выдаются такие ошибки:
Member function must be called or its address taken
Qualifier ‘ios_base’ is not a class or namespace name
Function call missing ) //по поводу двух параметров buf ?
Undefined symbol ‘istream_iterator’
Expression syntax
Может быть нужно подключить какие-нибудь библиотеки?( у меня подключены iostream.h, cstring.h, fstream.h, ctype.h, stdlib.h, а в программировании я новичок)
Попробовал и вариант:
string buf;
int c = f.get();
while ( !f.eof() ) {
buf.push_back( static_cast( c ) );
c = f.get();
}
Выдаётся следующая ошибка: ‘push_back’ is not a member of ‘string’
Вариант Longobard’a ещё не пробовал.
P.S Программирую я под Windows, так как в институте Linux’a нет.
Попробовал вариант:
ifstream f( «test.txt» );
if ( f.good ) {
f.unsetf( ios_base::skipws );
string buf( istream_iterator( f ), istream_iterator() );
cout << «Got [" << buf << "]\n»;
}
Выдаются такие ошибки:
Member function must be called or its address taken
Qualifier ‘ios_base’ is not a class or namespace name
Function call missing ) //по поводу двух параметров buf ?
Undefined symbol ‘istream_iterator’
Expression syntax
Может быть нужно подключить какие-нибудь библиотеки?( у меня подключены iostream.h, cstring.h, fstream.h, ctype.h, stdlib.h, а в программировании я новичок)
Попробовал и вариант:
string buf;
int c = f.get();
while ( !f.eof() ) {
buf.push_back( static_cast( c ) );
c = f.get();
}
Выдаётся следующая ошибка: ‘push_back’ is not a member of ‘string’
Вариант Longobard’a ещё не пробовал.
P.S Программирую я под Windows, так как в институте Linux’a нет.
В помойке есть примеры. В примерах это есть.
У Вас наверное старый компилятор. Дело в том, что современный С++ использует заголовочные файлы (не библиотеки) названия которых не заканчиваются на *.h Кроме того современный basic_string включает в себя (по стандарту) push_back метод.
Код с mmap у Вас не пойдет на Windows.
Должен компилироваться и работать на всех системах с современными космпиляторами С++
Я его только что прогнал на Linux и на Mac OS X
g++ -Wall -o fr test.cc
gcc version 3.3
Если у Вас нет современного компилятора, то советую скачать cygwin. Он в себя включает, насколько я знаю, нормалбный gcc
Лучше — MinGW.
Подскажите а с юникс aio_* что-то подобное есть? оболчки для этих апи итд? Тщетно пытался с ними работать((
Ты сам понял, что сказал? Если ты имел ввиду:
«Есть ли под UNIX реалицазии POSIX API асинхронного ввода/вывода (aio_*)?»
то — да.
я имел в виду класс реализующий чтение по строкам или как там еще может понадобится на основе асинхронных апи. Вобще может либы и оболочки есть, чтобы ошибки самому не проверять итд