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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.93
OrmaJever
9 / 9 / 0
Регистрация: 10.11.2011
Сообщений: 241
#1

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

06.05.2014, 23:29. Просмотров 2261. Ответов 50
Метки нет (Все метки)

В общем мне казалась задача вполне очевидна и частая считать файл целиком в строку, но почему-то я не нашёл ничего готового (типа fstream::readAll()).
Оператор >> игнорирует пробельные символы, вычитал отсюда fstream - символ пробела что можно использовать getline, но меня смущает что туда нужно передавать буфер заранее известного размеры, вам не кажется что это как-то дико и в Си стиле? По-моему в современном мире функция должна сама создать буфер и вернуть мне его. В общем как вы читаете весь файл и затем записываете его в переменную?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.05.2014, 23:29
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Чтение всего файла fstream (C++):

Fstream - чтение из файла - C++
подскажите начинающему программисту как читать файл целиком.. например последовательность чисел

Заменить чтение из файла аналогом fstream - C++
char fileName; printf("Enter file name: "); scanf("%255s", fileName); FILE *open = fopen(fileName, "r"); ...

Чтение файла в массив символов используя fstream - C++
Добрый день. Нужно считать файл в массив символов(vector). Использую fstream.

Как начать чтение файла сначала после Getline с первой строчки в fstream? - C++
Пишу программу,которая читает строки их текстового файла и передаёт их в поле Edit1 поочерёдно,по нажатию кнопки.Когда строки...

Не могу разобраться. Чтение и вывод на экран всего содержимого файла .txt на консоль - C++
#include <cstdio> #include <iostream> #include <conio.h> #include <fstream> using namespace std; void main() { ...

fstream не работает и чтение и запись - C++
Добрый день! Не пойму, почему введение функции getline становится причиной того, что запись в файл не идет. Если getline убрать, то все...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
-=ЮрА=-
Заблокирован
Автор FAQ
07.05.2014, 00:15 #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
9 / 9 / 0
Регистрация: 10.11.2011
Сообщений: 241
07.05.2014, 01:05  [ТС] #3
-=ЮрА=-, Короче как я понял человеческих вариантов нету, брать длину, создавать буфер... Это и в Си стиле было, могли бы и метод у fstream сделать
Croessmah
Модератор
Эксперт CЭксперт С++
13134 / 7397 / 828
Регистрация: 27.09.2012
Сообщений: 18,227
Записей в блоге: 3
Завершенные тесты: 1
07.05.2014, 01:07 #4
Цитата Сообщение от OrmaJever Посмотреть сообщение
могли бы и метод у fstream сделать
И как бы это выглядело?
Jupiter
Каратель
Эксперт С++
6553 / 3973 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
07.05.2014, 01:09 #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
9 / 9 / 0
Регистрация: 10.11.2011
Сообщений: 241
07.05.2014, 01:09  [ТС] #6
Цитата Сообщение от Croessmah Посмотреть сообщение
И как бы это выглядело?
C++
1
2
fstream fs("file.txt");
string str = fs.readAll();
А реализовывалось оно так как написал Юра только может немного оптимизированее, на асемблере что ли
-=ЮрА=-
Заблокирован
Автор FAQ
07.05.2014, 01:20 #7
OrmaJever, отнаследуйся от fstream и сделай себе свой readAll();
Croessmah
Модератор
Эксперт CЭксперт С++
13134 / 7397 / 828
Регистрация: 27.09.2012
Сообщений: 18,227
Записей в блоге: 3
Завершенные тесты: 1
07.05.2014, 01:23 #8
Цитата Сообщение от OrmaJever Посмотреть сообщение
string str = fs.readAll();
Файл - это набор байт, который можно расценить как текст, но который по сути может быть чем угодно, так зачем жестко цеплять istream к string. Надо прочитать текст - делайте своё, не вопрос
OrmaJever
9 / 9 / 0
Регистрация: 10.11.2011
Сообщений: 241
07.05.2014, 01:43  [ТС] #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
Каратель
Эксперт С++
6553 / 3973 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
07.05.2014, 01:48 #10
способ №2
C++
1
2
3
4
std::ifstream file("text.txt");
std::ostringstream oss;
oss << file.rdbuf();
std::string str = oss.str();
OrmaJever
9 / 9 / 0
Регистрация: 10.11.2011
Сообщений: 241
07.05.2014, 13:00  [ТС] #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
Каратель
Эксперт С++
6553 / 3973 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
07.05.2014, 14:22 #12
Цитата Сообщение от OrmaJever Посмотреть сообщение
1) В чём разница между fstream, ifstream и ofstream. Я понимаю что последние 2 от слова input и output, но не могу в голове понять зачем они? Неужели параметров в конструкторе уже не обойтись и нужно делать отдельный класс?
а открывать файл на чтение и писать туда что-то, это нормально?

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

Цитата Сообщение от newbie666 Посмотреть сообщение
Всегда можно хелпер функций настрочить, сколько годно
Которая первым параметром будет принимать ссылку на строку? Да можно конечно, но наследование то зачем? Наследование сделано для расширения базового класса, что мне собственно и нужно, или я что-то не понимаю?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.05.2014, 15:17
Привет! Вот еще темы с ответами:

Запись/чтение структуры через fstream - C++
Доброго времени суток! у меня есть несколько вопросов по поводу файловых потоков. 1. Как можно записать/прочитать массив структур в...

Запись/чтение структур (файлы) + разница между FILE * и <fstream> - C++
Всем привет. Порыскал по форуму, погуглил... Решения есть, но они не ясны (что, почему да как) и не все работают. Однако, я так и не нашёл...

fstream, создание файла - C++
Привет всем, не могу справиться с проблемой. fstream file(FILE,ios::in|ios::out|ios::binary); файл не создается, но если создать...

Запись в середину файла - fstream - C++
Как можно при помощи fstream (хотелось бы именно им, потому что он умеет и читать, и писать) записать что-либо в середину файла (или куда...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
07.05.2014, 15:17
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru