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

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

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

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

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

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

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

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

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

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

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

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

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

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
stima
449 / 298 / 20
Регистрация: 22.03.2011
Сообщений: 966
Завершенные тесты: 2
07.05.2014, 16:43     Чтение всего файла fstream #21
Цитата Сообщение от 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
6913 / 4106 / 933
Регистрация: 30.01.2014
Сообщений: 6,903
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
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
6913 / 4106 / 933
Регистрация: 30.01.2014
Сообщений: 6,903
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
9 / 9 / 0
Регистрация: 10.11.2011
Сообщений: 241
07.05.2014, 20:21  [ТС]     Чтение всего файла fstream #26
Ладненько со всем этим по очереди разберусь. Тогда ещё один я думаю простой вопрос, если я создам чистый класс
C++
1
class A {}
Какие конструкторы/методы компилятор сам в него добавит?
DrOffset
6913 / 4106 / 933
Регистрация: 30.01.2014
Сообщений: 6,903
07.05.2014, 20:42     Чтение всего файла fstream #27
Цитата Сообщение от OrmaJever Посмотреть сообщение
Какие конструкторы/методы компилятор сам в него добавит?
1. Конструктор по-умолчанию (без параметров);
2. Конструктор копирования;
3. Деструктор;
4. Оператор присваивания (copy-assignment).
В С++11 еще добавляются:
5. Конструктор перемещения;
6. Оператор перемещения (move-assignment).

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

Добавлено через 9 минут
Конструктор по-умолчанию не добавляется, если определен любой из пользовательских конструкторов.
Остальные методы не добавляются, если существуют определенные пользователем альтернативы.
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
6913 / 4106 / 933
Регистрация: 30.01.2014
Сообщений: 6,903
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
9 / 9 / 0
Регистрация: 10.11.2011
Сообщений: 241
07.05.2014, 20:54  [ТС]     Чтение всего файла fstream #30
Цитата Сообщение от DrOffset Посмотреть сообщение
void в скобках не надо писать. Эта надобность была в С, из-за того, что func() обозначала не функцию без параметров, а функцию с бесконечным числом параметров, т.е. аналог func(...). В С++ такого нет.
Я знаю, но по моему красиво В общем вроде всё понятно. Спасибо ещё раз.
DrOffset
6913 / 4106 / 933
Регистрация: 30.01.2014
Сообщений: 6,903
07.05.2014, 21:02     Чтение всего файла fstream #31
Цитата Сообщение от OrmaJever Посмотреть сообщение
Я знаю, но по моему красиво
Дело хозяйское
По поводу новых возможностей полезно посматривать C++11 FAQ Страуструпа, без лишней воды и с примерами. Есть ссылки на подробные источники.
Tulosba
:)
Эксперт С++
4392 / 3235 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
07.05.2014, 21:37     Чтение всего файла fstream #32
Цитата Сообщение от DrOffset Посмотреть сообщение
а функцию с бесконечным числом параметров
я бы сказал, с любым. А то получается, что можно вызвать только с бесконечным же кол-вом параметров.
Цитата Сообщение от DrOffset Посмотреть сообщение
C++
1
class string : public std::string
Всё таки не приспособлен стандартный строковый класс для публичного наследования. Хотя бы даже из-за отсутствия виртуальных функций (в частности, деструктора).
DrOffset
6913 / 4106 / 933
Регистрация: 30.01.2014
Сообщений: 6,903
07.05.2014, 21:53     Чтение всего файла fstream #33
Цитата Сообщение от Tulosba Посмотреть сообщение
Всё таки не приспособлен стандартный строковый класс для публичного наследования. Хотя бы даже из-за отсутствия виртуальных функций (в частности, деструктора)
Вообще-то, такое наследование - это код ТС, ко мне отношения не имеет.
А вообще, лично я считаю полезной практикой отвечать именно на тот вопрос, который задал ТС, путь он и не всегда согласуется с моими личными представлениями о правильности. Если бы я вместо того, чтобы отвечать на вопрос начал бы критиковать подход ТС с наследованием std::string, то как бы я выглядел в его глазах?
Цитата Сообщение от Tulosba Посмотреть сообщение
я бы сказал, с любым. А то получается, что можно вызвать только с бесконечным же кол-вом параметров.
Ага.
Tulosba
:)
Эксперт С++
4392 / 3235 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
07.05.2014, 22:14     Чтение всего файла fstream #34
DrOffset, нельзя идти на поводу у ТС. Надо жесткой хваткой взять его и сказать: "что же ты делаешь! Так нельзя.Потому что: раз, два и три". Я бы например предложил ТС использовать Qt с ее QString и прочими финтифлюшками, а не городить свои чудо-строки (тем более наследуясь от std::string). Раз уж хочется большого спектра готовых функций.
Наличие опыта отвечающего это все таки показатель, что к ответу (совету) будут прислушиваться, а здесь получается, что тема уходит в другую плоскость и главная проблема теряется из виду.
DrOffset
6913 / 4106 / 933
Регистрация: 30.01.2014
Сообщений: 6,903
07.05.2014, 22:33     Чтение всего файла fstream #35
Цитата Сообщение от Tulosba Посмотреть сообщение
DrOffset, нельзя идти на поводу у ТС. Надо жесткой хваткой взять его и сказать: "что же ты делаешь! Так нельзя.Потому что: раз, два и три".
Да-да. Именно поэтому 80% ответов на этом форуме совсем не о том, о чем спрашивали.
Цитата Сообщение от Tulosba Посмотреть сообщение
Я бы например предложил ТС использовать Qt с ее QString и прочими финтифлюшками, а не городить свои чудо-строки (тем более наследуясь от std::string). Раз уж хочется большого спектра готовых функций.
Ну так и предложил бы. Я-то здесь причем? Я отвечал на конкретный вопрос, как оказалось у автора в этой теме были пробелы. Будешь утверждать, что мой ответ был бесполезен и автор ничего нового не почерпнул?
Цитата Сообщение от Tulosba Посмотреть сообщение
Наличие опыта отвечающего это все таки показатель, что к ответу (совету) будут прислушиваться, а здесь получается, что тема уходит в другую плоскость и главная проблема теряется из виду.
Да она давно уже ушла. Главная тема вообще была про потоки и чтение в буфер. И что QString, что наследование std::string к ней не относятся в равной степени.

Добавлено через 11 минут
Цитата Сообщение от Tulosba Посмотреть сообщение
что же ты делаешь! Так нельзя.
А про "так нельзя" это слишком самоуверенно. Хотя бы потому, что автор (даже не обязательно наш ТС) не обязательно студент и не обязательно у него там есть особый выбор инструментов. Он может быть заложником ситуации, legacy код и все дела. А ты ему "дорогой, ты делаешь все неправильно. Тут все надо переделать и вообще использовать С++11, да еще и бустом присыпать.".
Другое дело когда автор пишет вообще какую-то ахинею, которая ни при каких обстоятельствах работать не будет - тут вот можно сказать "так нельзя". Но откровенной ахинеи лично я здесь не вижу. Спорные моменты есть конечно, но форумы для того и есть, чтобы каждый мог высказаться. Вот тебе показалось это неправильным, скажи это ТС, возможно он и прислушается.
Tulosba
:)
Эксперт С++
4392 / 3235 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
07.05.2014, 22:54     Чтение всего файла fstream #36
Цитата Сообщение от DrOffset Посмотреть сообщение
80% ответов на этом форуме совсем не о том, о чем спрашивали.
Ага. И мы продолжаем этот процент увеличивать прямо сейчас
Цитата Сообщение от DrOffset Посмотреть сообщение
Будешь утверждать, что мой ответ был бесполезен и автор ничего нового не почерпнул?
Не буду. Но некоторые моменты режут глаз. Типа как объяснить устройство автомобиля, но не уточнить, что нельзя заливать бензин в дизельный двигатель и наоборот.
Цитата Сообщение от DrOffset Посмотреть сообщение
Да она давно уже ушла.
Вот я тоже посмотрел на название темы и вижу, что разговор совсем уже о другом.
Цитата Сообщение от DrOffset Посмотреть сообщение
И что QString, что наследование std::string к ней не относятся в равной степени.
Я отвечал на конкретный вопрос, как оказалось у автора в этой теме были пробелы. (с)
Цитата Сообщение от DrOffset Посмотреть сообщение
Вот тебе показалось это неправильным, скажи это ТС, возможно он и прислушается.
Я не думаю, что если я сказал это, обращаясь к тебе, а не ТС, он не сможет уловить сути
Цитата Сообщение от DrOffset Посмотреть сообщение
А про "так нельзя" это слишком самоуверенно.
В случае публичного наследования от std::string это факт.
DrOffset
6913 / 4106 / 933
Регистрация: 30.01.2014
Сообщений: 6,903
07.05.2014, 22:59     Чтение всего файла fstream #37
Цитата Сообщение от Tulosba Посмотреть сообщение
обращаясь к тебе, а не ТС, он не сможет уловить сути
Как минимум у него не появится уведомление о том, что кто-то к нему обратился.
Цитата Сообщение от Tulosba Посмотреть сообщение
Я отвечал на конкретный вопрос, как оказалось у автора в этой теме были пробелы.
Мимо. Я отвечал вот на этот вопрос:
Цитата Сообщение от OrmaJever Посмотреть сообщение
То есть родительские методы переносятся частично, да я смогу к обьекту HL::string применить родительский метод append, но с операторами и конструкторами такая вот беда. Я один считаю что это не правильно?
Как видишь, он не имеет прямого отношения к наследованию std::string.
Цитата Сообщение от Tulosba Посмотреть сообщение
Но некоторые моменты режут глаз. Типа как объяснить устройство автомобиля, но не уточнить, что нельзя заливать бензин в дизельный двигатель и наоборот.
Цитата Сообщение от DrOffset Посмотреть сообщение
форумы для того и есть, чтобы каждый мог высказаться.
Дополняй, если есть что сказать
Tulosba
:)
Эксперт С++
4392 / 3235 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
07.05.2014, 23:04     Чтение всего файла fstream #38
Цитата Сообщение от DrOffset Посмотреть сообщение
Как минимум у него не появится уведомление о том, что кто-то к нему обратился.
А вот ты о чем... я отключил эту фичу как только она появилась
Цитата Сообщение от DrOffset Посмотреть сообщение
Дополняй, если есть что сказать
Пойду по другим темам пройдусь. Тут уже всё понятно.
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 (хотелось бы именно им, потому что он умеет и читать, и писать) записать что-либо в середину файла (или куда...

Определение длины файла для fstream - C++
fseek(input, 0, SEEK_END); //указываем позицыю unsigned long SizeOfIshod = ftell(input);//создаем переменную которая будет возвращать...

Очистка/удаление файла *.txt с помощью fstream - C++
Как с помощью#include &lt;fstream&gt; очистить/удалить файл по заданному пути?

Открытие файла через объекта класса fstream - C++
Есть функция: bool Lr::MakeFile() { string name, fullname; cout &lt;&lt;&quot;Введите имя нового файла:&quot;; cin.sync(); ...

Получение размера файла с помощью fstream. ОТВЕТ. - C++
Для того, кто не знает как получить размер файла, и того, кто не хочет пользоваться API или не умеет: ВОТ ПОЛУЧЕНИЕ РАЗМЕРА: fstream...


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

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

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