Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

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

В общем мне казалась задача вполне очевидна и частая считать файл целиком в строку, но почему-то я не нашёл ничего готового (типа fstream::readAll()).
Оператор >> игнорирует пробельные символы, вычитал отсюда fstream - символ пробела что можно использовать getline, но меня смущает что туда нужно передавать буфер заранее известного размеры, вам не кажется что это как-то дико и в Си стиле? По-моему в современном мире функция должна сама создать буфер и вернуть мне его. В общем как вы читаете весь файл и затем записываете его в переменную?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
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 убрать, то все...

50
DrOffset
7387 / 4464 / 1013
Регистрация: 30.01.2014
Сообщений: 7,317
07.05.2014, 21:02 #31
Цитата Сообщение от OrmaJever Посмотреть сообщение
Я знаю, но по моему красиво
Дело хозяйское
По поводу новых возможностей полезно посматривать C++11 FAQ Страуструпа, без лишней воды и с примерами. Есть ссылки на подробные источники.
0
Tulosba
:)
Эксперт С++
4397 / 3233 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
07.05.2014, 21:37 #32
Цитата Сообщение от DrOffset Посмотреть сообщение
а функцию с бесконечным числом параметров
я бы сказал, с любым. А то получается, что можно вызвать только с бесконечным же кол-вом параметров.
Цитата Сообщение от DrOffset Посмотреть сообщение
C++
1
class string : public std::string
Всё таки не приспособлен стандартный строковый класс для публичного наследования. Хотя бы даже из-за отсутствия виртуальных функций (в частности, деструктора).
0
DrOffset
7387 / 4464 / 1013
Регистрация: 30.01.2014
Сообщений: 7,317
07.05.2014, 21:53 #33
Цитата Сообщение от Tulosba Посмотреть сообщение
Всё таки не приспособлен стандартный строковый класс для публичного наследования. Хотя бы даже из-за отсутствия виртуальных функций (в частности, деструктора)
Вообще-то, такое наследование - это код ТС, ко мне отношения не имеет.
А вообще, лично я считаю полезной практикой отвечать именно на тот вопрос, который задал ТС, путь он и не всегда согласуется с моими личными представлениями о правильности. Если бы я вместо того, чтобы отвечать на вопрос начал бы критиковать подход ТС с наследованием std::string, то как бы я выглядел в его глазах?
Цитата Сообщение от Tulosba Посмотреть сообщение
я бы сказал, с любым. А то получается, что можно вызвать только с бесконечным же кол-вом параметров.
Ага.
0
Tulosba
:)
Эксперт С++
4397 / 3233 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
07.05.2014, 22:14 #34
DrOffset, нельзя идти на поводу у ТС. Надо жесткой хваткой взять его и сказать: "что же ты делаешь! Так нельзя.Потому что: раз, два и три". Я бы например предложил ТС использовать Qt с ее QString и прочими финтифлюшками, а не городить свои чудо-строки (тем более наследуясь от std::string). Раз уж хочется большого спектра готовых функций.
Наличие опыта отвечающего это все таки показатель, что к ответу (совету) будут прислушиваться, а здесь получается, что тема уходит в другую плоскость и главная проблема теряется из виду.
1
DrOffset
7387 / 4464 / 1013
Регистрация: 30.01.2014
Сообщений: 7,317
07.05.2014, 22:33 #35
Цитата Сообщение от Tulosba Посмотреть сообщение
DrOffset, нельзя идти на поводу у ТС. Надо жесткой хваткой взять его и сказать: "что же ты делаешь! Так нельзя.Потому что: раз, два и три".
Да-да. Именно поэтому 80% ответов на этом форуме совсем не о том, о чем спрашивали.
Цитата Сообщение от Tulosba Посмотреть сообщение
Я бы например предложил ТС использовать Qt с ее QString и прочими финтифлюшками, а не городить свои чудо-строки (тем более наследуясь от std::string). Раз уж хочется большого спектра готовых функций.
Ну так и предложил бы. Я-то здесь причем? Я отвечал на конкретный вопрос, как оказалось у автора в этой теме были пробелы. Будешь утверждать, что мой ответ был бесполезен и автор ничего нового не почерпнул?
Цитата Сообщение от Tulosba Посмотреть сообщение
Наличие опыта отвечающего это все таки показатель, что к ответу (совету) будут прислушиваться, а здесь получается, что тема уходит в другую плоскость и главная проблема теряется из виду.
Да она давно уже ушла. Главная тема вообще была про потоки и чтение в буфер. И что QString, что наследование std::string к ней не относятся в равной степени.

Добавлено через 11 минут
Цитата Сообщение от Tulosba Посмотреть сообщение
что же ты делаешь! Так нельзя.
А про "так нельзя" это слишком самоуверенно. Хотя бы потому, что автор (даже не обязательно наш ТС) не обязательно студент и не обязательно у него там есть особый выбор инструментов. Он может быть заложником ситуации, legacy код и все дела. А ты ему "дорогой, ты делаешь все неправильно. Тут все надо переделать и вообще использовать С++11, да еще и бустом присыпать.".
Другое дело когда автор пишет вообще какую-то ахинею, которая ни при каких обстоятельствах работать не будет - тут вот можно сказать "так нельзя". Но откровенной ахинеи лично я здесь не вижу. Спорные моменты есть конечно, но форумы для того и есть, чтобы каждый мог высказаться. Вот тебе показалось это неправильным, скажи это ТС, возможно он и прислушается.
0
Tulosba
:)
Эксперт С++
4397 / 3233 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
07.05.2014, 22:54 #36
Цитата Сообщение от DrOffset Посмотреть сообщение
80% ответов на этом форуме совсем не о том, о чем спрашивали.
Ага. И мы продолжаем этот процент увеличивать прямо сейчас
Цитата Сообщение от DrOffset Посмотреть сообщение
Будешь утверждать, что мой ответ был бесполезен и автор ничего нового не почерпнул?
Не буду. Но некоторые моменты режут глаз. Типа как объяснить устройство автомобиля, но не уточнить, что нельзя заливать бензин в дизельный двигатель и наоборот.
Цитата Сообщение от DrOffset Посмотреть сообщение
Да она давно уже ушла.
Вот я тоже посмотрел на название темы и вижу, что разговор совсем уже о другом.
Цитата Сообщение от DrOffset Посмотреть сообщение
И что QString, что наследование std::string к ней не относятся в равной степени.
Я отвечал на конкретный вопрос, как оказалось у автора в этой теме были пробелы. (с)
Цитата Сообщение от DrOffset Посмотреть сообщение
Вот тебе показалось это неправильным, скажи это ТС, возможно он и прислушается.
Я не думаю, что если я сказал это, обращаясь к тебе, а не ТС, он не сможет уловить сути
Цитата Сообщение от DrOffset Посмотреть сообщение
А про "так нельзя" это слишком самоуверенно.
В случае публичного наследования от std::string это факт.
0
DrOffset
7387 / 4464 / 1013
Регистрация: 30.01.2014
Сообщений: 7,317
07.05.2014, 22:59 #37
Цитата Сообщение от Tulosba Посмотреть сообщение
обращаясь к тебе, а не ТС, он не сможет уловить сути
Как минимум у него не появится уведомление о том, что кто-то к нему обратился.
Цитата Сообщение от Tulosba Посмотреть сообщение
Я отвечал на конкретный вопрос, как оказалось у автора в этой теме были пробелы.
Мимо. Я отвечал вот на этот вопрос:
Цитата Сообщение от OrmaJever Посмотреть сообщение
То есть родительские методы переносятся частично, да я смогу к обьекту HL::string применить родительский метод append, но с операторами и конструкторами такая вот беда. Я один считаю что это не правильно?
Как видишь, он не имеет прямого отношения к наследованию std::string.
Цитата Сообщение от Tulosba Посмотреть сообщение
Но некоторые моменты режут глаз. Типа как объяснить устройство автомобиля, но не уточнить, что нельзя заливать бензин в дизельный двигатель и наоборот.
Цитата Сообщение от DrOffset Посмотреть сообщение
форумы для того и есть, чтобы каждый мог высказаться.
Дополняй, если есть что сказать
0
Tulosba
:)
Эксперт С++
4397 / 3233 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
07.05.2014, 23:04 #38
Цитата Сообщение от DrOffset Посмотреть сообщение
Как минимум у него не появится уведомление о том, что кто-то к нему обратился.
А вот ты о чем... я отключил эту фичу как только она появилась
Цитата Сообщение от DrOffset Посмотреть сообщение
Дополняй, если есть что сказать
Пойду по другим темам пройдусь. Тут уже всё понятно.
0
OrmaJever
9 / 9 / 0
Регистрация: 10.11.2011
Сообщений: 241
07.05.2014, 23:33  [ТС] #39
Цитата Сообщение от Tulosba Посмотреть сообщение
DrOffset, нельзя идти на поводу у ТС. Надо жесткой хваткой взять его и сказать: "что же ты делаешь! Так нельзя.Потому что: раз, два и три". Я бы например предложил ТС использовать Qt с ее QString и прочими финтифлюшками, а не городить свои чудо-строки (тем более наследуясь от std::string). Раз уж хочется большого спектра готовых функций.
DrOffset, как раз поступил правильно, меня его ответ устроил более чем полностью, и я даже взял с него много нового и интересного! В данном случае я не использую qt потому что то что я пишу в большей степени алгоритм и он очень зависим от скорости работы, я со слезами на глазах менял char * на std::string и потерял при этом ~10% скорости. Да и qt сразу загоняет тебя в свою идеалогию, если используешь один класс то нужно использовать и всё остальное, в клиентских приложениях с гуем он хорош, но не в моём случае.
Цитата Сообщение от Tulosba Посмотреть сообщение
Как минимум у него не появится уведомление о том, что кто-то к нему обратился.
та мне оно и не нужно, переодически захожу и читаю свежие советы.
0
DrOffset
7387 / 4464 / 1013
Регистрация: 30.01.2014
Сообщений: 7,317
07.05.2014, 23:49 #40
Цитата Сообщение от OrmaJever Посмотреть сообщение
я со слезами на глазах менял char * на std::string и потерял при этом ~10% скорости
А чем конкретно это было вызвано удалось понять?
Очень большая цифра 10%, есть мнение, что ее можно сократить весьма значительно.
0
OrmaJever
9 / 9 / 0
Регистрация: 10.11.2011
Сообщений: 241
07.05.2014, 23:56  [ТС] #41
Цитата Сообщение от DrOffset Посмотреть сообщение
А чем конкретно это было вызвано удалось понять?
не удалось, потому что я переписывал не поэтапно, а всё сразу и поэтому просто сравнил время ДО и ПОСЛЕ, и получилось вот так. Возможно конечно я реализовал не идеально, но факт есть фактом, хотя я этому даже не удивлён, особенно после прочтения этой статьи http://habrahabr.ru/post/175691/
0
DrOffset
7387 / 4464 / 1013
Регистрация: 30.01.2014
Сообщений: 7,317
08.05.2014, 00:10 #42
Цитата Сообщение от OrmaJever Посмотреть сообщение
не удалось, потому что я переписывал не поэтапно, а всё сразу и поэтому просто сравнил время ДО и ПОСЛЕ, и получилось вот так.
Я бы натравил профайлер и посмотрел где именно проседает производительность.
Цитата Сообщение от OrmaJever Посмотреть сообщение
хотя я этому даже не удивлён, особенно после прочтения этой статьи
Там есть весьма интересные апдейты, касающиеся С++11 В частности в С++11 стандартом явно запрещено использование методики c подсчетом ссылок для реализации std::string.

Добавлено через 2 минуты
OrmaJever, и да, тестирование которое проведено в статье, сломало оптимизацию. Поэтому получились такие хреновые результаты.
0
Avazart
Эксперт С++
7432 / 5471 / 310
Регистрация: 10.12.2010
Сообщений: 24,384
Записей в блоге: 17
08.05.2014, 00:10 #43
Цитата Сообщение от Croessmah Посмотреть сообщение
но который по сути может быть чем угодно, так зачем жестко цеплять istream к string.
Кроме того, если файл содержит символы "NULL" то в std::string запишеться только часть...
0
DrOffset
7387 / 4464 / 1013
Регистрация: 30.01.2014
Сообщений: 7,317
08.05.2014, 00:16 #44
Цитата Сообщение от Avazart Посмотреть сообщение
Кроме того, если файл содержит символы "NULL" то в std::string
Это смотря как записывать Вообще std::string потенциально может хранить бинарные данные. Некоторые либины, например google :: protobuf, активно этим пользуются. Хотя мне лично такой use-case не очень по душе.
0
Avazart
Эксперт С++
7432 / 5471 / 310
Регистрация: 10.12.2010
Сообщений: 24,384
Записей в блоге: 17
08.05.2014, 00:24 #45
Как уже сказали наследоваться от std::string не хорошо, но никто не мешает использовать std::string в качестве "реализации"

C++
1
2
3
4
5
6
7
8
9
10
11
12
class mystring
{
   // ...
   public:
     char* с_str()
     {
        retrun impl_.с_str();   
     }
   // ...
   private:
     std::string impl_; // или std::vector<char> или еще что нибудь...
};
Что касается методов, по мнению некоторых авторов их и так намного больше чем надо, и следовало бы их вынести в отдельные ф-ции не связанные с классом std::string

Добавлено через 1 минуту
DrOffset,
Цитата Сообщение от DrOffset Посмотреть сообщение
Это смотря как записывать Вообще std::string потенциально может хранить бинарные данные.
Я не помню нюансов, но помню что с этим были проблемы, поэтому использовал как и рекомендуют вектор символов.
0
08.05.2014, 00:24
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.05.2014, 00:24
Привет! Вот еще темы с ответами:

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
45
Ответ Создать тему
Опции темы

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