Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.99/76: Рейтинг темы: голосов - 76, средняя оценка - 4.99
 Аватар для OrmaJever
9 / 9 / 0
Регистрация: 10.11.2011
Сообщений: 241

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

06.05.2014, 23:29. Показов 17155. Ответов 51
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В общем мне казалась задача вполне очевидна и частая считать файл целиком в строку, но почему-то я не нашёл ничего готового (типа fstream::readAll()).
Оператор >> игнорирует пробельные символы, вычитал отсюда fstream - символ пробела что можно использовать getline, но меня смущает что туда нужно передавать буфер заранее известного размеры, вам не кажется что это как-то дико и в Си стиле? По-моему в современном мире функция должна сама создать буфер и вернуть мне его. В общем как вы читаете весь файл и затем записываете его в переменную?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
06.05.2014, 23:29
Ответы с готовыми решениями:

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

Чтение файла через fstream
прочитать из файла матрицу и записать в новый файл её минимальный элемент в первой строке задана размерность матрицы файл: 10 8 ...

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

51
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
07.05.2014, 00:15
Цитата Сообщение от 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  
1
 Аватар для OrmaJever
9 / 9 / 0
Регистрация: 10.11.2011
Сообщений: 241
07.05.2014, 01:05  [ТС]
-=ЮрА=-, Короче как я понял человеческих вариантов нету, брать длину, создавать буфер... Это и в Си стиле было, могли бы и метод у fstream сделать
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
07.05.2014, 01:07
Цитата Сообщение от OrmaJever Посмотреть сообщение
могли бы и метод у fstream сделать
И как бы это выглядело?
0
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
07.05.2014, 01:09
C++
1
2
3
std::ifstream file("text.txt");
file >> std::noskipws;
std::string str(std::istream_iterator<char>(file), std::istream_iterator<char>());
1
 Аватар для OrmaJever
9 / 9 / 0
Регистрация: 10.11.2011
Сообщений: 241
07.05.2014, 01:09  [ТС]
Цитата Сообщение от Croessmah Посмотреть сообщение
И как бы это выглядело?
C++
1
2
fstream fs("file.txt");
string str = fs.readAll();
А реализовывалось оно так как написал Юра только может немного оптимизированее, на асемблере что ли
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
07.05.2014, 01:20
OrmaJever, отнаследуйся от fstream и сделай себе свой readAll();
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
07.05.2014, 01:23
Цитата Сообщение от OrmaJever Посмотреть сообщение
string str = fs.readAll();
Файл - это набор байт, который можно расценить как текст, но который по сути может быть чем угодно, так зачем жестко цеплять istream к string. Надо прочитать текст - делайте своё, не вопрос
0
 Аватар для OrmaJever
9 / 9 / 0
Регистрация: 10.11.2011
Сообщений: 241
07.05.2014, 01:43  [ТС]
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
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
0
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
07.05.2014, 01:48
способ №2
C++
1
2
3
4
std::ifstream file("text.txt");
std::ostringstream oss;
oss << file.rdbuf();
std::string str = oss.str();
2
 Аватар для OrmaJever
9 / 9 / 0
Регистрация: 10.11.2011
Сообщений: 241
07.05.2014, 13:00  [ТС]
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 ... то будет жаловаться что нету соответствующего конструктора или оператора=. Почему не вызывается родительский метод то? То есть я должен создать в своём классе все возможные методы и в них просто вызывать такие же из родителя? Не бред ли?
0
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
07.05.2014, 14:22
Цитата Сообщение от OrmaJever Посмотреть сообщение
1) В чём разница между fstream, ifstream и ofstream. Я понимаю что последние 2 от слова input и output, но не могу в голове понять зачем они? Неужели параметров в конструкторе уже не обойтись и нужно делать отдельный класс?
а открывать файл на чтение и писать туда что-то, это нормально?

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

Цитата Сообщение от newbie666 Посмотреть сообщение
Всегда можно хелпер функций настрочить, сколько годно
Которая первым параметром будет принимать ссылку на строку? Да можно конечно, но наследование то зачем? Наследование сделано для расширения базового класса, что мне собственно и нужно, или я что-то не понимаю?
0
Заблокирован
07.05.2014, 15:19
Цитата Сообщение от OrmaJever Посмотреть сообщение
Да можно конечно, но наследование то зачем?
приведи перечь по твоему мнению не достающих функций стандартного std::string
0
 Аватар для OrmaJever
9 / 9 / 0
Регистрация: 10.11.2011
Сообщений: 241
07.05.2014, 15:54  [ТС]
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 можно сделать цепочку, но по мне нагляднее оператор <<.
0
503 / 352 / 94
Регистрация: 22.03.2011
Сообщений: 1,112
07.05.2014, 16:15
Ты платишь только за то что используешь. (с) Страуструп.
Нужно -> реализовывай.

Добавлено через 54 секунды
п.с. Перефразирую readAll/toLower/etc это излишество, которое можно реализовать самому.
0
Заблокирован
07.05.2014, 16:16
галимые доводы, всё это делается элементарно.
Ну если ты хочешь свой спецовый класс - делай класс String, в конструктор которог передавай строку и делай с ней что хочешь ёлки палки, ни от чего наследоваться не надо... Что, без примера никак ?
0
 Аватар для OrmaJever
9 / 9 / 0
Регистрация: 10.11.2011
Сообщений: 241
07.05.2014, 16:27  [ТС]
Цитата Сообщение от stima Посмотреть сообщение
readAll/toLower/etc это излишество, которое можно реализовать самому.
Цитата Сообщение от newbie666 Посмотреть сообщение
галимые доводы, всё это делается элементарно.
Так это же круто, я не против! Я это и реализовал сам, но из-за 3 методов мне пришлось добавлять 3 конструктора и 2 оператора=, потому что просто так из родительского класса они вызываться не хотят. А вот теперь ещё и нужно ити искать какой конструктор отвечает за эту строку
C++
1
std::string str = oss.str();
и тоже его дописывать, а завтра я захочу использовать ещё какие нибудь операторы или передам в конструктор что-то другое (что вполне принимает std::string), и снова придётся писать бессмысленный метод который просто вызовет такой же только родительский.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
07.05.2014, 16:27
Помогаю со студенческими работами здесь

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

Чтение/Редактирование/Создание Файла без fstream
fstream конфликтует с используемой мною библиотекой ImGui, при создании объекта для fstream ( прим. std::fstream fileobj; ...

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru