Форум программистов, компьютерный форум CyberForum.ru

Чтение всего файла fstream - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.93
OrmaJever
 Аватар для OrmaJever
9 / 9 / 0
Регистрация: 10.11.2011
Сообщений: 241
06.05.2014, 23:29     Чтение всего файла fstream #1
В общем мне казалась задача вполне очевидна и частая считать файл целиком в строку, но почему-то я не нашёл ничего готового (типа fstream::readAll()).
Оператор >> игнорирует пробельные символы, вычитал отсюда fstream - символ пробела что можно использовать getline, но меня смущает что туда нужно передавать буфер заранее известного размеры, вам не кажется что это как-то дико и в Си стиле? По-моему в современном мире функция должна сама создать буфер и вернуть мне его. В общем как вы читаете весь файл и затем записываете его в переменную?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
-=ЮрА=-
Заблокирован
Автор FAQ
07.05.2014, 00:15     Чтение всего файла fstream #2
Цитата Сообщение от OrmaJever Посмотреть сообщение
В общем мне казалась задача вполне очевидна и частая считать файл целиком в строку,
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <fstream>
#include <iostream>
using namespace std;
 
int main(){
    size_t length = 0;
    char * lpBuf  = 0;
    fstream fs("file.txt", ios::in);
    if( fs.is_open() )
    {
        fs.seekg(0, ios::end);
        length = fs.tellg();
        fs.seekg(0, ios::beg);
 
        lpBuf = new char[1 + length];
        fs.read(lpBuf, length);
        lpBuf[length] = 0;
        cout<<lpBuf<<endl;
    }
    cin.get();
    return 0;
}
Миниатюры
Чтение всего файла fstream  
OrmaJever
 Аватар для OrmaJever
9 / 9 / 0
Регистрация: 10.11.2011
Сообщений: 241
07.05.2014, 01:05  [ТС]     Чтение всего файла fstream #3
-=ЮрА=-, Короче как я понял человеческих вариантов нету, брать длину, создавать буфер... Это и в Си стиле было, могли бы и метод у fstream сделать
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11809 / 6788 / 767
Регистрация: 27.09.2012
Сообщений: 16,840
Записей в блоге: 2
Завершенные тесты: 1
07.05.2014, 01:07     Чтение всего файла fstream #4
Цитата Сообщение от OrmaJever Посмотреть сообщение
могли бы и метод у fstream сделать
И как бы это выглядело?
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
07.05.2014, 01:09     Чтение всего файла fstream #5
C++
1
2
3
std::ifstream file("text.txt");
file >> std::noskipws;
std::string str(std::istream_iterator<char>(file), std::istream_iterator<char>());
OrmaJever
 Аватар для OrmaJever
9 / 9 / 0
Регистрация: 10.11.2011
Сообщений: 241
07.05.2014, 01:09  [ТС]     Чтение всего файла fstream #6
Цитата Сообщение от Croessmah Посмотреть сообщение
И как бы это выглядело?
C++
1
2
fstream fs("file.txt");
string str = fs.readAll();
А реализовывалось оно так как написал Юра только может немного оптимизированее, на асемблере что ли
-=ЮрА=-
Заблокирован
Автор FAQ
07.05.2014, 01:20     Чтение всего файла fstream #7
OrmaJever, отнаследуйся от fstream и сделай себе свой readAll();
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11809 / 6788 / 767
Регистрация: 27.09.2012
Сообщений: 16,840
Записей в блоге: 2
Завершенные тесты: 1
07.05.2014, 01:23     Чтение всего файла fstream #8
Цитата Сообщение от OrmaJever Посмотреть сообщение
string str = fs.readAll();
Файл - это набор байт, который можно расценить как текст, но который по сути может быть чем угодно, так зачем жестко цеплять istream к string. Надо прочитать текст - делайте своё, не вопрос
OrmaJever
 Аватар для OrmaJever
9 / 9 / 0
Регистрация: 10.11.2011
Сообщений: 241
07.05.2014, 01:43  [ТС]     Чтение всего файла fstream #9
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
OrmaJever, отнаследуйся от fstream и сделай себе свой readAll();
Тут даже вопрос зачем мне наследоваться? Я могу написать свой класс в котором буду читать всё старыми способами через fopen/fget, но зачем тогда классы fstream, ifstream, ofstream? Они же должны нести хоть какую то пользу и давать хоть какие-нибудь готовые решения?
Цитата Сообщение от Croessmah Посмотреть сообщение
Файл - это набор байт, который можно расценить как текст, но который по сути может быть чем угодно, так зачем жестко цеплять istream к string. Надо прочитать текст - делайте своё, не вопрос
Та господи, пусть бы readAll сделали шаблоном в который я сам указывал тип, или сделали какой-то общий тип, да и файл по сути может быть только текстовым и бинарным, что там заморачиваться?

Меня удивляет в этом то что неужели чтение всего файла за раз это такая редкая операция и она нужна только мне и только на раз? По-моему большее количество (не больших) файлов нужно читать полностью, и очень удивительно что в стандартной библиотеке нет для этого маленького оптимизированого метода

Добавлено через 11 минут
Цитата Сообщение от Jupiter Посмотреть сообщение
std::ifstream file("text.txt");
file >> std::noskipws;
std::string str(std::istream_iterator<char>(file), std::istream_iterator<char>());
Очень жаль но у меня в str находится 1
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
07.05.2014, 01:48     Чтение всего файла fstream #10
способ №2
C++
1
2
3
4
std::ifstream file("text.txt");
std::ostringstream oss;
oss << file.rdbuf();
std::string str = oss.str();
OrmaJever
 Аватар для OrmaJever
9 / 9 / 0
Регистрация: 10.11.2011
Сообщений: 241
07.05.2014, 13:00  [ТС]     Чтение всего файла fstream #11
Jupiter, Спасибо этот вариант работает!

Добавлено через 1 час 5 минут
Задам ещё 2 вопроса которые не дают спокойно жить.
1) В чём разница между fstream, ifstream и ofstream. Я понимаю что последние 2 от слова input и output, но не могу в голове понять зачем они? Неужели параметров в конструкторе уже не обойтись и нужно делать отдельный класс?

2) Почему при наследовании не вызываются родительские методы, вот например код Jupiter'a будет работать и так
C++
1
2
3
4
std::ifstream file("text.txt");
std::ostringstream oss;
oss << file.rdbuf();
std::string str = oss.str();
для std::string вызовется соответствующий конструктор, и даже так
C++
1
2
3
4
5
std::ifstream file("text.txt");
std::ostringstream oss;
std::string str;
oss << file.rdbuf();
str = oss.str();
для std::string вызовется нужный оператор=, но вот если я решу унаследовать класс std::string и дописать туда парочку своих методов и буду писать не std::string str... , а myString str ... то будет жаловаться что нету соответствующего конструктора или оператора=. Почему не вызывается родительский метод то? То есть я должен создать в своём классе все возможные методы и в них просто вызывать такие же из родителя? Не бред ли?
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
07.05.2014, 14:22     Чтение всего файла fstream #12
Цитата Сообщение от OrmaJever Посмотреть сообщение
1) В чём разница между fstream, ifstream и ofstream. Я понимаю что последние 2 от слова input и output, но не могу в голове понять зачем они? Неужели параметров в конструкторе уже не обойтись и нужно делать отдельный класс?
а открывать файл на чтение и писать туда что-то, это нормально?

Добавлено через 1 минуту
Цитата Сообщение от OrmaJever Посмотреть сообщение
Не бред ли?
бред наследоваться от std::string
OrmaJever
 Аватар для OrmaJever
9 / 9 / 0
Регистрация: 10.11.2011
Сообщений: 241
07.05.2014, 14:43  [ТС]     Чтение всего файла fstream #13
Цитата Сообщение от Jupiter Посмотреть сообщение
а открывать файл на чтение и писать туда что-то, это нормально?
а зачем писать в файл если ты открыл его на чтение?))
Цитата Сообщение от Jupiter Посмотреть сообщение
бред наследоваться от std::string
А как быть то? мне не хватает буквально 2 метода у стандартных строк, как быть в этой ситуации? Да и не строки тут виноваты, такая фигня всегда если в своём классе нет нужного конструктора то родительский не вызовется, странное поведение.
newbie666
Заблокирован
07.05.2014, 14:52     Чтение всего файла fstream #14
Цитата Сообщение от OrmaJever Посмотреть сообщение
А как быть то?
ну свой класс строки напиши. Хотя зачем... Всегда можно хелпер функций настрочить, сколько годно ...
OrmaJever
 Аватар для OrmaJever
9 / 9 / 0
Регистрация: 10.11.2011
Сообщений: 241
07.05.2014, 15:17  [ТС]     Чтение всего файла fstream #15
Цитата Сообщение от newbie666 Посмотреть сообщение
ну свой класс строки напиши.
Есть 2 причины так не делать
Во-первых зачем тратить время что бы написать уже написанное?
Во-вторых std::string оптимизирован и написать такой же по скорости класс у меня не получится.

Цитата Сообщение от newbie666 Посмотреть сообщение
Всегда можно хелпер функций настрочить, сколько годно
Которая первым параметром будет принимать ссылку на строку? Да можно конечно, но наследование то зачем? Наследование сделано для расширения базового класса, что мне собственно и нужно, или я что-то не понимаю?
newbie666
Заблокирован
07.05.2014, 15:19     Чтение всего файла fstream #16
Цитата Сообщение от OrmaJever Посмотреть сообщение
Да можно конечно, но наследование то зачем?
приведи перечь по твоему мнению не достающих функций стандартного std::string
OrmaJever
 Аватар для OrmaJever
9 / 9 / 0
Регистрация: 10.11.2011
Сообщений: 241
07.05.2014, 15:54  [ТС]     Чтение всего файла fstream #17
1) replace. Да я знаю что он там есть, но он делает немного другое. Нужно что бы все вхождения строки "from" она заменила на "to". from может быть как меньше to так и больше (по длине).
2) toLower, toUpper. Мелочь, но мне нужно.
3) из-за приоритетов у оператора += нельзя сделать цепочку вызовов (str += "some str" += "append" += "this is string" ), только раставлять скобки (((str += "some str") += "append") += "this is string"), что по-моему дико поэтому я переопределяю оператор << в котором вызываю append. Ах да, с append можно сделать цепочку, но по мне нагляднее оператор <<.
stima
429 / 284 / 16
Регистрация: 22.03.2011
Сообщений: 923
Завершенные тесты: 1
07.05.2014, 16:15     Чтение всего файла fstream #18
Ты платишь только за то что используешь. (с) Страуструп.
Нужно -> реализовывай.

Добавлено через 54 секунды
п.с. Перефразирую readAll/toLower/etc это излишество, которое можно реализовать самому.
newbie666
Заблокирован
07.05.2014, 16:16     Чтение всего файла fstream #19
галимые доводы, всё это делается элементарно.
Ну если ты хочешь свой спецовый класс - делай класс String, в конструктор которог передавай строку и делай с ней что хочешь ёлки палки, ни от чего наследоваться не надо... Что, без примера никак ?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.05.2014, 16:27     Чтение всего файла fstream
Еще ссылки по теме:

Запись в середину файла - fstream C++
Fstream - чтение из файла C++
C++ Как начать чтение файла сначала после Getline с первой строчки в fstream?

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
OrmaJever
 Аватар для OrmaJever
9 / 9 / 0
Регистрация: 10.11.2011
Сообщений: 241
07.05.2014, 16:27  [ТС]     Чтение всего файла fstream #20
Цитата Сообщение от stima Посмотреть сообщение
readAll/toLower/etc это излишество, которое можно реализовать самому.
Цитата Сообщение от newbie666 Посмотреть сообщение
галимые доводы, всё это делается элементарно.
Так это же круто, я не против! Я это и реализовал сам, но из-за 3 методов мне пришлось добавлять 3 конструктора и 2 оператора=, потому что просто так из родительского класса они вызываться не хотят. А вот теперь ещё и нужно ити искать какой конструктор отвечает за эту строку
C++
1
std::string str = oss.str();
и тоже его дописывать, а завтра я захочу использовать ещё какие нибудь операторы или передам в конструктор что-то другое (что вполне принимает std::string), и снова придётся писать бессмысленный метод который просто вызовет такой же только родительский.
Yandex
Объявления
07.05.2014, 16:27     Чтение всего файла fstream
Ответ Создать тему
Опции темы

Текущее время: 20:21. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru