9 / 9 / 0
Регистрация: 10.11.2011
Сообщений: 241
|
|
1 | |
Чтение всего файла fstream06.05.2014, 23:29. Показов 15193. Ответов 51
Метки нет (Все метки)
В общем мне казалась задача вполне очевидна и частая считать файл целиком в строку, но почему-то я не нашёл ничего готового (типа fstream::readAll()).
Оператор >> игнорирует пробельные символы, вычитал отсюда fstream - символ пробела что можно использовать getline, но меня смущает что туда нужно передавать буфер заранее известного размеры, вам не кажется что это как-то дико и в Си стиле? По-моему в современном мире функция должна сама создать буфер и вернуть мне его. В общем как вы читаете весь файл и затем записываете его в переменную?
0
|
06.05.2014, 23:29 | |
Ответы с готовыми решениями:
51
Fstream - чтение из файла Чтение файла через fstream Заменить чтение из файла аналогом fstream Чтение файла в массив символов используя fstream |
503 / 352 / 94
Регистрация: 22.03.2011
Сообщений: 1,112
|
|
07.05.2014, 16:43 | 21 |
Я не понял, Вам метод нужен?, тогда он не бессмысленный. Иначе зачем он Вам?
п.с. Такое чувство, что разговор скатывается к: "Я хочу кнопку, при нажатии на которую все будет работать. При этом я ничего делать не хочу".
0
|
9 / 9 / 0
Регистрация: 10.11.2011
Сообщений: 241
|
||||||||||||||||||||||||||
07.05.2014, 17:09 [ТС] | 22 | |||||||||||||||||||||||||
Окей, видимо вы реально не понимаете о чём я. Пример
Код
error: no match for 'operator=' (operand types are 'HL::string' and 'const char*') Проблема то в том что компилятор не берёт его из родительского класса, а ищет только в моём. И что бы этот код работал нужно добавить
0
|
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
|
||||||||||||||||
07.05.2014, 17:53 | 23 | |||||||||||||||
Родительские методы переносятся все (кроме конструкторов - думаю понятно почему, если не понятно, то стоит поразмышлять о том, что конструктор привязан к типу).
Оператор operator= переносится из базового класса. Но есть такая штука, как сокрытие методов. Поясню на более очевидном примере:
Теперь вернемся к operator=. Дело в том, что в твоем наследнике HL::string уже есть operator=, это автогенерированный
Да, в С++11 появилась возможность наследовать и конструкторы. Точно так же, через using.
1
|
9 / 9 / 0
Регистрация: 10.11.2011
Сообщений: 241
|
|||||||||||
07.05.2014, 18:19 [ТС] | 24 | ||||||||||
DrOffset, ну вот! Вы же тот человек который пришёл и всё разложил по полочкам. Огромное спасибо!
Добавлено через 15 минут Хотя всё таки небольшая непоняточка осталась. Берём пример Jupiter'a
Код
error: no matching function for call to 'HL::string::string(std::basic_ostringstream<char>::__string_type)'
Как его найти?
0
|
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
|
||||||
07.05.2014, 19:09 | 25 | |||||
Потому что именно такого конструктора нет. Его придется написать самостоятельно:
OrmaJever, предупреждая дальнейшие вопросы, советую тщательно изучить тему связанную с наследованием конструкторов в С++11. Иначе, пользоваться инструментом не понимая как он работает довольно опасно. Начать можно отсюда. А потом настоятельно рекомендую почитать параграф 12.9 стандарта С++. Если все-таки что-то будет не понятно, то спрашивай тогда здесь
1
|
9 / 9 / 0
Регистрация: 10.11.2011
Сообщений: 241
|
||||||
07.05.2014, 20:21 [ТС] | 26 | |||||
Ладненько со всем этим по очереди разберусь. Тогда ещё один я думаю простой вопрос, если я создам чистый класс
0
|
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
|
|
07.05.2014, 20:42 | 27 |
1. Конструктор по-умолчанию (без параметров);
2. Конструктор копирования; 3. Деструктор; 4. Оператор присваивания (copy-assignment). В С++11 еще добавляются: 5. Конструктор перемещения; 6. Оператор перемещения (move-assignment). Все эти методы будут являться тривиальными в данном случае (trivial). Добавлено через 9 минут Конструктор по-умолчанию не добавляется, если определен любой из пользовательских конструкторов. Остальные методы не добавляются, если существуют определенные пользователем альтернативы.
1
|
9 / 9 / 0
Регистрация: 10.11.2011
Сообщений: 241
|
|
07.05.2014, 20:45 [ТС] | 28 |
Правильно ли я понял
1) myClass( void ); 2) myClass( const myClass & ); 3) ~myClass( void ); 4) void operator=( ? ); // какой параметр? myClass & ? 5) myClass( myClass && ); 6) myClass& operator= ( myCLass && ); 5 и 6 я взял из описания std::string, но не понимаю что они делают. && - ссылка на ссылку или логический оператор AND?
0
|
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
|
|
07.05.2014, 20:50 | 29 |
Это так называемая rvalue reference. C помощью них организована семантика перемещения в С++11.
1) myClass(); 2) myClass( const myClass & ); 3) ~myClass(); 4) myClass & operator=(const myClass &); 5) myClass( myClass && ); 6) myClass& operator= ( myCLass && ); void в скобках не надо писать. Эта надобность была в С, из-за того, что func() обозначала не функцию без параметров, а функцию с бесконечным числом параметров, т.е. аналог func(...). В С++ такого нет.
1
|
9 / 9 / 0
Регистрация: 10.11.2011
Сообщений: 241
|
|
07.05.2014, 20:54 [ТС] | 30 |
0
|
:)
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
|
|
07.05.2014, 21:37 | 32 |
я бы сказал, с любым. А то получается, что можно вызвать только с бесконечным же кол-вом параметров.
Всё таки не приспособлен стандартный строковый класс для публичного наследования. Хотя бы даже из-за отсутствия виртуальных функций (в частности, деструктора).
0
|
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
|
|
07.05.2014, 21:53 | 33 |
Вообще-то, такое наследование - это код ТС, ко мне отношения не имеет.
А вообще, лично я считаю полезной практикой отвечать именно на тот вопрос, который задал ТС, путь он и не всегда согласуется с моими личными представлениями о правильности. Если бы я вместо того, чтобы отвечать на вопрос начал бы критиковать подход ТС с наследованием std::string, то как бы я выглядел в его глазах? Ага.
0
|
:)
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
|
|
07.05.2014, 22:14 | 34 |
DrOffset, нельзя идти на поводу у ТС. Надо жесткой хваткой взять его и сказать: "что же ты делаешь! Так нельзя.Потому что: раз, два и три". Я бы например предложил ТС использовать Qt с ее QString и прочими финтифлюшками, а не городить свои чудо-строки (тем более наследуясь от std::string). Раз уж хочется большого спектра готовых функций.
Наличие опыта отвечающего это все таки показатель, что к ответу (совету) будут прислушиваться, а здесь получается, что тема уходит в другую плоскость и главная проблема теряется из виду.
1
|
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
|
|
07.05.2014, 22:33 | 35 |
Да-да. Именно поэтому 80% ответов на этом форуме совсем не о том, о чем спрашивали.
Ну так и предложил бы. Я-то здесь причем? Я отвечал на конкретный вопрос, как оказалось у автора в этой теме были пробелы. Будешь утверждать, что мой ответ был бесполезен и автор ничего нового не почерпнул? Да она давно уже ушла. Главная тема вообще была про потоки и чтение в буфер. И что QString, что наследование std::string к ней не относятся в равной степени. Добавлено через 11 минут А про "так нельзя" это слишком самоуверенно. Хотя бы потому, что автор (даже не обязательно наш ТС) не обязательно студент и не обязательно у него там есть особый выбор инструментов. Он может быть заложником ситуации, legacy код и все дела. А ты ему "дорогой, ты делаешь все неправильно. Тут все надо переделать и вообще использовать С++11, да еще и бустом присыпать.". Другое дело когда автор пишет вообще какую-то ахинею, которая ни при каких обстоятельствах работать не будет - тут вот можно сказать "так нельзя". Но откровенной ахинеи лично я здесь не вижу. Спорные моменты есть конечно, но форумы для того и есть, чтобы каждый мог высказаться. Вот тебе показалось это неправильным, скажи это ТС, возможно он и прислушается.
0
|
:)
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
|
|
07.05.2014, 22:54 | 36 |
Ага. И мы продолжаем этот процент увеличивать прямо сейчас
Не буду. Но некоторые моменты режут глаз. Типа как объяснить устройство автомобиля, но не уточнить, что нельзя заливать бензин в дизельный двигатель и наоборот.
Вот я тоже посмотрел на название темы и вижу, что разговор совсем уже о другом.
Я отвечал на конкретный вопрос, как оказалось у автора в этой теме были пробелы. (с) Я не думаю, что если я сказал это, обращаясь к тебе, а не ТС, он не сможет уловить сути В случае публичного наследования от std::string это факт.
0
|
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
|
|
07.05.2014, 22:59 | 37 |
Как минимум у него не появится уведомление о том, что кто-то к нему обратился.
Мимо. Я отвечал вот на этот вопрос: Как видишь, он не имеет прямого отношения к наследованию std::string. Дополняй, если есть что сказать
0
|
9 / 9 / 0
Регистрация: 10.11.2011
Сообщений: 241
|
|
07.05.2014, 23:33 [ТС] | 39 |
DrOffset, как раз поступил правильно, меня его ответ устроил более чем полностью, и я даже взял с него много нового и интересного! В данном случае я не использую qt потому что то что я пишу в большей степени алгоритм и он очень зависим от скорости работы, я со слезами на глазах менял char * на std::string и потерял при этом ~10% скорости. Да и qt сразу загоняет тебя в свою идеалогию, если используешь один класс то нужно использовать и всё остальное, в клиентских приложениях с гуем он хорош, но не в моём случае.
та мне оно и не нужно, переодически захожу и читаю свежие советы.
0
|
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
|
|
07.05.2014, 23:49 | 40 |
А чем конкретно это было вызвано удалось понять?
Очень большая цифра 10%, есть мнение, что ее можно сократить весьма значительно.
0
|
07.05.2014, 23:49 | |
07.05.2014, 23:49 | |
Помогаю со студенческими работами здесь
40
Чтение/Редактирование/Создание Файла без fstream Как начать чтение файла сначала после Getline с первой строчки в fstream? Не могу разобраться. Чтение и вывод на экран всего содержимого файла .txt на консоль fstream не работает и чтение и запись Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |