Форум программистов, компьютерный форум 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, но меня смущает что туда нужно передавать буфер заранее известного размеры, вам не кажется что это как-то дико и в Си стиле? По-моему в современном мире функция должна сама создать буфер и вернуть мне его. В общем как вы читаете весь файл и затем записываете его в переменную?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
stima
429 / 284 / 16
Регистрация: 22.03.2011
Сообщений: 923
Завершенные тесты: 1
07.05.2014, 16:43     Чтение всего файла fstream #21
Цитата Сообщение от OrmaJever Посмотреть сообщение
бессмысленный метод который просто вызовет такой же только родительский.
Я не понял, Вам метод нужен?, тогда он не бессмысленный. Иначе зачем он Вам?

п.с. Такое чувство, что разговор скатывается к: "Я хочу кнопку, при нажатии на которую все будет работать. При этом я ничего делать не хочу".
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
OrmaJever
 Аватар для OrmaJever
9 / 9 / 0
Регистрация: 10.11.2011
Сообщений: 241
07.05.2014, 17:09  [ТС]     Чтение всего файла fstream #22
Цитата Сообщение от stima Посмотреть сообщение
Я не понял, Вам метод нужен?, тогда он не бессмысленный. Иначе зачем он Вам?
Окей, видимо вы реально не понимаете о чём я. Пример
C++
1
2
3
4
5
6
7
8
9
10
11
12
namespace HL{ 
    class string : public std::string
    {
    public:
        string &operator<<( const char );
        string &operator<<( const char * );
        string &operator<<( const string & );
 
        string toLower( void ) const;
        string toUpper( void ) const;
        string replace( const char *, const char * );
    };
далее при создании
C++
1
2
HL::string str;
str = "some string";
Код
error: no match for 'operator=' (operand types are 'HL::string' and 'const char*')
хотя как вы понимаете в std::string есть operator=(const char *).
Проблема то в том что компилятор не берёт его из родительского класса, а ищет только в моём. И что бы этот код работал нужно добавить
C++
1
2
3
4
5
HL::string &HL::string::operator= ( const char *str )
{
    assign( str );
    return *this;
}
бесполезность метода очевидна? Такая же беда и с конструкторами
C++
1
HL::string str("some value");
вежливо попросит меня создать конструктор HL::string(const char *), и выглядеть он будет так
C++
1
HL::string(const char *str) : std::string( str ) {}
То есть родительские методы переносятся частично, да я смогу к обьекту HL::string применить родительский метод append, но с операторами и конструкторами такая вот беда. Я один считаю что это не правильно?
DrOffset
6423 / 3797 / 878
Регистрация: 30.01.2014
Сообщений: 6,585
07.05.2014, 17:53     Чтение всего файла fstream #23
Цитата Сообщение от OrmaJever Посмотреть сообщение
То есть родительские методы переносятся частично, да я смогу к обьекту HL::string применить родительский метод append, но с операторами и конструкторами такая вот беда. Я один считаю что это не правильно?
Родительские методы переносятся все (кроме конструкторов - думаю понятно почему, если не понятно, то стоит поразмышлять о том, что конструктор привязан к типу).
Оператор operator= переносится из базового класса. Но есть такая штука, как сокрытие методов. Поясню на более очевидном примере:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
 
class B
{
public:
    B & foo(char const *) { std::cout << "B::foo\n"; return *this; }
};
 
 
class A : public B
{
public:
    A & foo(int) { std::cout << "A::foo\n"; return *this; }
};
 
 
int main()
{
    A a;
 
    //a.foo("test"); // ошибка
    a.foo(1); // OK
}
Видишь, метод foo из базовго класса недоступен. Его скрыл метод foo из наследника.
Теперь вернемся к operator=. Дело в том, что в твоем наследнике HL::string уже есть operator=, это автогенерированный
C++
1
HL::string & operator=(HL::string const &)
вот он-то и скрыл оператор из базового string. В С++ есть стандартный способ сделать скрытую функцию видимой.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
namespace HL{ 
    class string : public std::string
    {
    public:
        using std::string::operator=;
 
        string &operator<<( const char );
        string &operator<<( const char * );
        string &operator<<( const string & );
 
        string toLower( void ) const;
        string toUpper( void ) const;
        string replace( const char *, const char * );
    };
Добавлено через 13 минут
Да, в С++11 появилась возможность наследовать и конструкторы. Точно так же, через using.
OrmaJever
 Аватар для OrmaJever
9 / 9 / 0
Регистрация: 10.11.2011
Сообщений: 241
07.05.2014, 18:19  [ТС]     Чтение всего файла fstream #24
DrOffset, ну вот! Вы же тот человек который пришёл и всё разложил по полочкам. Огромное спасибо!

Добавлено через 15 минут
Хотя всё таки небольшая непоняточка осталась.
Берём пример 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 на HL::string (в котором написано using std::string::string, то компилятор не может найти подходящий конструктор, а именно
Код
error: no matching function for call to 'HL::string::string(std::basic_ostringstream<char>::__string_type)'
хотя реально показывает что искал среди всех конструкторов std::string, да и в доках у std::string нету конструктора подходящего для
C++
1
std::basic_ostringstream<char>::__string_type
.
Как его найти?
DrOffset
6423 / 3797 / 878
Регистрация: 30.01.2014
Сообщений: 6,585
07.05.2014, 19:09     Чтение всего файла fstream #25
Цитата Сообщение от OrmaJever Посмотреть сообщение
то компилятор не может найти подходящий конструктор, а именно
Потому что именно такого конструктора нет. Его придется написать самостоятельно:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
namespace HL{ 
    class string : public std::string
    {
    public:
        string(std::string const & value)
            : std::string(value)
        {} 
 
        string &operator<<( const char );
        string &operator<<( const char * );
        string &operator<<( const string & );
 
        string toLower( void ) const;
        string toUpper( void ) const;
        string replace( const char *, const char * );
    };
Почему так? Потом что методы наследника, если они определены с такой же сигнатурой, всегда имеют приоритет перед перенесенными методами из базового класса. Т.е. автогенерированный конструктор копирования HL::string заменил наследованный конструктор копирования из std::string, поэтому его и нет в HL::string.

OrmaJever, предупреждая дальнейшие вопросы, советую тщательно изучить тему связанную с наследованием конструкторов в С++11. Иначе, пользоваться инструментом не понимая как он работает довольно опасно. Начать можно отсюда. А потом настоятельно рекомендую почитать параграф 12.9 стандарта С++.
Если все-таки что-то будет не понятно, то спрашивай тогда здесь
OrmaJever
 Аватар для OrmaJever
9 / 9 / 0
Регистрация: 10.11.2011
Сообщений: 241
07.05.2014, 20:21  [ТС]     Чтение всего файла fstream #26
Ладненько со всем этим по очереди разберусь. Тогда ещё один я думаю простой вопрос, если я создам чистый класс
C++
1
class A {}
Какие конструкторы/методы компилятор сам в него добавит?
DrOffset
6423 / 3797 / 878
Регистрация: 30.01.2014
Сообщений: 6,585
07.05.2014, 20:42     Чтение всего файла fstream #27
Цитата Сообщение от OrmaJever Посмотреть сообщение
Какие конструкторы/методы компилятор сам в него добавит?
1. Конструктор по-умолчанию (без параметров);
2. Конструктор копирования;
3. Деструктор;
4. Оператор присваивания (copy-assignment).
В С++11 еще добавляются:
5. Конструктор перемещения;
6. Оператор перемещения (move-assignment).

Все эти методы будут являться тривиальными в данном случае (trivial).

Добавлено через 9 минут
Конструктор по-умолчанию не добавляется, если определен любой из пользовательских конструкторов.
Остальные методы не добавляются, если существуют определенные пользователем альтернативы.
OrmaJever
 Аватар для OrmaJever
9 / 9 / 0
Регистрация: 10.11.2011
Сообщений: 241
07.05.2014, 20:45  [ТС]     Чтение всего файла fstream #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?
DrOffset
6423 / 3797 / 878
Регистрация: 30.01.2014
Сообщений: 6,585
07.05.2014, 20:50     Чтение всего файла fstream #29
Цитата Сообщение от OrmaJever Посмотреть сообщение
&& - ссылка на ссылку или логический оператор AND?
Это так называемая rvalue reference. C помощью них организована семантика перемещения в С++11.
Цитата Сообщение от OrmaJever Посмотреть сообщение
Правильно ли я понял
1) myClass();
2) myClass( const myClass & );
3) ~myClass();
4) myClass & operator=(const myClass &);
5) myClass( myClass && );
6) myClass& operator= ( myCLass && );
void в скобках не надо писать. Эта надобность была в С, из-за того, что func() обозначала не функцию без параметров, а функцию с бесконечным числом параметров, т.е. аналог func(...). В С++ такого нет.
OrmaJever
 Аватар для OrmaJever
9 / 9 / 0
Регистрация: 10.11.2011
Сообщений: 241
07.05.2014, 20:54  [ТС]     Чтение всего файла fstream #30
Цитата Сообщение от DrOffset Посмотреть сообщение
void в скобках не надо писать. Эта надобность была в С, из-за того, что func() обозначала не функцию без параметров, а функцию с бесконечным числом параметров, т.е. аналог func(...). В С++ такого нет.
Я знаю, но по моему красиво В общем вроде всё понятно. Спасибо ещё раз.
DrOffset
6423 / 3797 / 878
Регистрация: 30.01.2014
Сообщений: 6,585
07.05.2014, 21:02     Чтение всего файла fstream #31
Цитата Сообщение от OrmaJever Посмотреть сообщение
Я знаю, но по моему красиво
Дело хозяйское
По поводу новых возможностей полезно посматривать C++11 FAQ Страуструпа, без лишней воды и с примерами. Есть ссылки на подробные источники.
Tulosba
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
07.05.2014, 21:37     Чтение всего файла fstream #32
Цитата Сообщение от DrOffset Посмотреть сообщение
а функцию с бесконечным числом параметров
я бы сказал, с любым. А то получается, что можно вызвать только с бесконечным же кол-вом параметров.
Цитата Сообщение от DrOffset Посмотреть сообщение
C++
1
class string : public std::string
Всё таки не приспособлен стандартный строковый класс для публичного наследования. Хотя бы даже из-за отсутствия виртуальных функций (в частности, деструктора).
DrOffset
6423 / 3797 / 878
Регистрация: 30.01.2014
Сообщений: 6,585
07.05.2014, 21:53     Чтение всего файла fstream #33
Цитата Сообщение от Tulosba Посмотреть сообщение
Всё таки не приспособлен стандартный строковый класс для публичного наследования. Хотя бы даже из-за отсутствия виртуальных функций (в частности, деструктора)
Вообще-то, такое наследование - это код ТС, ко мне отношения не имеет.
А вообще, лично я считаю полезной практикой отвечать именно на тот вопрос, который задал ТС, путь он и не всегда согласуется с моими личными представлениями о правильности. Если бы я вместо того, чтобы отвечать на вопрос начал бы критиковать подход ТС с наследованием std::string, то как бы я выглядел в его глазах?
Цитата Сообщение от Tulosba Посмотреть сообщение
я бы сказал, с любым. А то получается, что можно вызвать только с бесконечным же кол-вом параметров.
Ага.
Tulosba
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
07.05.2014, 22:14     Чтение всего файла fstream #34
DrOffset, нельзя идти на поводу у ТС. Надо жесткой хваткой взять его и сказать: "что же ты делаешь! Так нельзя.Потому что: раз, два и три". Я бы например предложил ТС использовать Qt с ее QString и прочими финтифлюшками, а не городить свои чудо-строки (тем более наследуясь от std::string). Раз уж хочется большого спектра готовых функций.
Наличие опыта отвечающего это все таки показатель, что к ответу (совету) будут прислушиваться, а здесь получается, что тема уходит в другую плоскость и главная проблема теряется из виду.
DrOffset
6423 / 3797 / 878
Регистрация: 30.01.2014
Сообщений: 6,585
07.05.2014, 22:33     Чтение всего файла fstream #35
Цитата Сообщение от Tulosba Посмотреть сообщение
DrOffset, нельзя идти на поводу у ТС. Надо жесткой хваткой взять его и сказать: "что же ты делаешь! Так нельзя.Потому что: раз, два и три".
Да-да. Именно поэтому 80% ответов на этом форуме совсем не о том, о чем спрашивали.
Цитата Сообщение от Tulosba Посмотреть сообщение
Я бы например предложил ТС использовать Qt с ее QString и прочими финтифлюшками, а не городить свои чудо-строки (тем более наследуясь от std::string). Раз уж хочется большого спектра готовых функций.
Ну так и предложил бы. Я-то здесь причем? Я отвечал на конкретный вопрос, как оказалось у автора в этой теме были пробелы. Будешь утверждать, что мой ответ был бесполезен и автор ничего нового не почерпнул?
Цитата Сообщение от Tulosba Посмотреть сообщение
Наличие опыта отвечающего это все таки показатель, что к ответу (совету) будут прислушиваться, а здесь получается, что тема уходит в другую плоскость и главная проблема теряется из виду.
Да она давно уже ушла. Главная тема вообще была про потоки и чтение в буфер. И что QString, что наследование std::string к ней не относятся в равной степени.

Добавлено через 11 минут
Цитата Сообщение от Tulosba Посмотреть сообщение
что же ты делаешь! Так нельзя.
А про "так нельзя" это слишком самоуверенно. Хотя бы потому, что автор (даже не обязательно наш ТС) не обязательно студент и не обязательно у него там есть особый выбор инструментов. Он может быть заложником ситуации, legacy код и все дела. А ты ему "дорогой, ты делаешь все неправильно. Тут все надо переделать и вообще использовать С++11, да еще и бустом присыпать.".
Другое дело когда автор пишет вообще какую-то ахинею, которая ни при каких обстоятельствах работать не будет - тут вот можно сказать "так нельзя". Но откровенной ахинеи лично я здесь не вижу. Спорные моменты есть конечно, но форумы для того и есть, чтобы каждый мог высказаться. Вот тебе показалось это неправильным, скажи это ТС, возможно он и прислушается.
Tulosba
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
07.05.2014, 22:54     Чтение всего файла fstream #36
Цитата Сообщение от DrOffset Посмотреть сообщение
80% ответов на этом форуме совсем не о том, о чем спрашивали.
Ага. И мы продолжаем этот процент увеличивать прямо сейчас
Цитата Сообщение от DrOffset Посмотреть сообщение
Будешь утверждать, что мой ответ был бесполезен и автор ничего нового не почерпнул?
Не буду. Но некоторые моменты режут глаз. Типа как объяснить устройство автомобиля, но не уточнить, что нельзя заливать бензин в дизельный двигатель и наоборот.
Цитата Сообщение от DrOffset Посмотреть сообщение
Да она давно уже ушла.
Вот я тоже посмотрел на название темы и вижу, что разговор совсем уже о другом.
Цитата Сообщение от DrOffset Посмотреть сообщение
И что QString, что наследование std::string к ней не относятся в равной степени.
Я отвечал на конкретный вопрос, как оказалось у автора в этой теме были пробелы. (с)
Цитата Сообщение от DrOffset Посмотреть сообщение
Вот тебе показалось это неправильным, скажи это ТС, возможно он и прислушается.
Я не думаю, что если я сказал это, обращаясь к тебе, а не ТС, он не сможет уловить сути
Цитата Сообщение от DrOffset Посмотреть сообщение
А про "так нельзя" это слишком самоуверенно.
В случае публичного наследования от std::string это факт.
DrOffset
6423 / 3797 / 878
Регистрация: 30.01.2014
Сообщений: 6,585
07.05.2014, 22:59     Чтение всего файла fstream #37
Цитата Сообщение от Tulosba Посмотреть сообщение
обращаясь к тебе, а не ТС, он не сможет уловить сути
Как минимум у него не появится уведомление о том, что кто-то к нему обратился.
Цитата Сообщение от Tulosba Посмотреть сообщение
Я отвечал на конкретный вопрос, как оказалось у автора в этой теме были пробелы.
Мимо. Я отвечал вот на этот вопрос:
Цитата Сообщение от OrmaJever Посмотреть сообщение
То есть родительские методы переносятся частично, да я смогу к обьекту HL::string применить родительский метод append, но с операторами и конструкторами такая вот беда. Я один считаю что это не правильно?
Как видишь, он не имеет прямого отношения к наследованию std::string.
Цитата Сообщение от Tulosba Посмотреть сообщение
Но некоторые моменты режут глаз. Типа как объяснить устройство автомобиля, но не уточнить, что нельзя заливать бензин в дизельный двигатель и наоборот.
Цитата Сообщение от DrOffset Посмотреть сообщение
форумы для того и есть, чтобы каждый мог высказаться.
Дополняй, если есть что сказать
Tulosba
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
07.05.2014, 23:04     Чтение всего файла fstream #38
Цитата Сообщение от DrOffset Посмотреть сообщение
Как минимум у него не появится уведомление о том, что кто-то к нему обратился.
А вот ты о чем... я отключил эту фичу как только она появилась
Цитата Сообщение от DrOffset Посмотреть сообщение
Дополняй, если есть что сказать
Пойду по другим темам пройдусь. Тут уже всё понятно.
OrmaJever
 Аватар для OrmaJever
9 / 9 / 0
Регистрация: 10.11.2011
Сообщений: 241
07.05.2014, 23:33  [ТС]     Чтение всего файла fstream #39
Цитата Сообщение от Tulosba Посмотреть сообщение
DrOffset, нельзя идти на поводу у ТС. Надо жесткой хваткой взять его и сказать: "что же ты делаешь! Так нельзя.Потому что: раз, два и три". Я бы например предложил ТС использовать Qt с ее QString и прочими финтифлюшками, а не городить свои чудо-строки (тем более наследуясь от std::string). Раз уж хочется большого спектра готовых функций.
DrOffset, как раз поступил правильно, меня его ответ устроил более чем полностью, и я даже взял с него много нового и интересного! В данном случае я не использую qt потому что то что я пишу в большей степени алгоритм и он очень зависим от скорости работы, я со слезами на глазах менял char * на std::string и потерял при этом ~10% скорости. Да и qt сразу загоняет тебя в свою идеалогию, если используешь один класс то нужно использовать и всё остальное, в клиентских приложениях с гуем он хорош, но не в моём случае.
Цитата Сообщение от Tulosba Посмотреть сообщение
Как минимум у него не появится уведомление о том, что кто-то к нему обратился.
та мне оно и не нужно, переодически захожу и читаю свежие советы.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.05.2014, 23:49     Чтение всего файла fstream
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
DrOffset
6423 / 3797 / 878
Регистрация: 30.01.2014
Сообщений: 6,585
07.05.2014, 23:49     Чтение всего файла fstream #40
Цитата Сообщение от OrmaJever Посмотреть сообщение
я со слезами на глазах менял char * на std::string и потерял при этом ~10% скорости
А чем конкретно это было вызвано удалось понять?
Очень большая цифра 10%, есть мнение, что ее можно сократить весьма значительно.
Yandex
Объявления
07.05.2014, 23:49     Чтение всего файла fstream
Ответ Создать тему
Опции темы

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