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

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

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

Author24 — интернет-сервис помощи студентам
В общем мне казалась задача вполне очевидна и частая считать файл целиком в строку, но почему-то я не нашёл ничего готового (типа fstream::readAll()).
Оператор >> игнорирует пробельные символы, вычитал отсюда fstream - символ пробела что можно использовать getline, но меня смущает что туда нужно передавать буфер заранее известного размеры, вам не кажется что это как-то дико и в Си стиле? По-моему в современном мире функция должна сама создать буфер и вернуть мне его. В общем как вы читаете весь файл и затем записываете его в переменную?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.05.2014, 23:29
Ответы с готовыми решениями:

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

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

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

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

51
503 / 352 / 94
Регистрация: 22.03.2011
Сообщений: 1,112
07.05.2014, 16:43 21
Author24 — интернет-сервис помощи студентам
Цитата Сообщение от OrmaJever Посмотреть сообщение
бессмысленный метод который просто вызовет такой же только родительский.
Я не понял, Вам метод нужен?, тогда он не бессмысленный. Иначе зачем он Вам?

п.с. Такое чувство, что разговор скатывается к: "Я хочу кнопку, при нажатии на которую все будет работать. При этом я ничего делать не хочу".
0
9 / 9 / 0
Регистрация: 10.11.2011
Сообщений: 241
07.05.2014, 17:09  [ТС] 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, но с операторами и конструкторами такая вот беда. Я один считаю что это не правильно?
0
18836 / 9837 / 2406
Регистрация: 30.01.2014
Сообщений: 17,275
07.05.2014, 17:53 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.
1
9 / 9 / 0
Регистрация: 10.11.2011
Сообщений: 241
07.05.2014, 18:19  [ТС] 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
.
Как его найти?
0
18836 / 9837 / 2406
Регистрация: 30.01.2014
Сообщений: 17,275
07.05.2014, 19:09 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 стандарта С++.
Если все-таки что-то будет не понятно, то спрашивай тогда здесь
1
9 / 9 / 0
Регистрация: 10.11.2011
Сообщений: 241
07.05.2014, 20:21  [ТС] 26
Ладненько со всем этим по очереди разберусь. Тогда ещё один я думаю простой вопрос, если я создам чистый класс
C++
1
class A {}
Какие конструкторы/методы компилятор сам в него добавит?
0
18836 / 9837 / 2406
Регистрация: 30.01.2014
Сообщений: 17,275
07.05.2014, 20:42 27
Цитата Сообщение от OrmaJever Посмотреть сообщение
Какие конструкторы/методы компилятор сам в него добавит?
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
18836 / 9837 / 2406
Регистрация: 30.01.2014
Сообщений: 17,275
07.05.2014, 20:50 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(...). В С++ такого нет.
1
9 / 9 / 0
Регистрация: 10.11.2011
Сообщений: 241
07.05.2014, 20:54  [ТС] 30
Цитата Сообщение от DrOffset Посмотреть сообщение
void в скобках не надо писать. Эта надобность была в С, из-за того, что func() обозначала не функцию без параметров, а функцию с бесконечным числом параметров, т.е. аналог func(...). В С++ такого нет.
Я знаю, но по моему красиво В общем вроде всё понятно. Спасибо ещё раз.
0
18836 / 9837 / 2406
Регистрация: 30.01.2014
Сообщений: 17,275
07.05.2014, 21:02 31
Цитата Сообщение от OrmaJever Посмотреть сообщение
Я знаю, но по моему красиво
Дело хозяйское
По поводу новых возможностей полезно посматривать C++11 FAQ Страуструпа, без лишней воды и с примерами. Есть ссылки на подробные источники.
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
07.05.2014, 21:37 32
Цитата Сообщение от DrOffset Посмотреть сообщение
а функцию с бесконечным числом параметров
я бы сказал, с любым. А то получается, что можно вызвать только с бесконечным же кол-вом параметров.
Цитата Сообщение от DrOffset Посмотреть сообщение
C++
1
class string : public std::string
Всё таки не приспособлен стандартный строковый класс для публичного наследования. Хотя бы даже из-за отсутствия виртуальных функций (в частности, деструктора).
0
18836 / 9837 / 2406
Регистрация: 30.01.2014
Сообщений: 17,275
07.05.2014, 21:53 33
Цитата Сообщение от Tulosba Посмотреть сообщение
Всё таки не приспособлен стандартный строковый класс для публичного наследования. Хотя бы даже из-за отсутствия виртуальных функций (в частности, деструктора)
Вообще-то, такое наследование - это код ТС, ко мне отношения не имеет.
А вообще, лично я считаю полезной практикой отвечать именно на тот вопрос, который задал ТС, путь он и не всегда согласуется с моими личными представлениями о правильности. Если бы я вместо того, чтобы отвечать на вопрос начал бы критиковать подход ТС с наследованием std::string, то как бы я выглядел в его глазах?
Цитата Сообщение от Tulosba Посмотреть сообщение
я бы сказал, с любым. А то получается, что можно вызвать только с бесконечным же кол-вом параметров.
Ага.
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
07.05.2014, 22:14 34
DrOffset, нельзя идти на поводу у ТС. Надо жесткой хваткой взять его и сказать: "что же ты делаешь! Так нельзя.Потому что: раз, два и три". Я бы например предложил ТС использовать Qt с ее QString и прочими финтифлюшками, а не городить свои чудо-строки (тем более наследуясь от std::string). Раз уж хочется большого спектра готовых функций.
Наличие опыта отвечающего это все таки показатель, что к ответу (совету) будут прислушиваться, а здесь получается, что тема уходит в другую плоскость и главная проблема теряется из виду.
1
18836 / 9837 / 2406
Регистрация: 30.01.2014
Сообщений: 17,275
07.05.2014, 22:33 35
Цитата Сообщение от Tulosba Посмотреть сообщение
DrOffset, нельзя идти на поводу у ТС. Надо жесткой хваткой взять его и сказать: "что же ты делаешь! Так нельзя.Потому что: раз, два и три".
Да-да. Именно поэтому 80% ответов на этом форуме совсем не о том, о чем спрашивали.
Цитата Сообщение от Tulosba Посмотреть сообщение
Я бы например предложил ТС использовать Qt с ее QString и прочими финтифлюшками, а не городить свои чудо-строки (тем более наследуясь от std::string). Раз уж хочется большого спектра готовых функций.
Ну так и предложил бы. Я-то здесь причем? Я отвечал на конкретный вопрос, как оказалось у автора в этой теме были пробелы. Будешь утверждать, что мой ответ был бесполезен и автор ничего нового не почерпнул?
Цитата Сообщение от Tulosba Посмотреть сообщение
Наличие опыта отвечающего это все таки показатель, что к ответу (совету) будут прислушиваться, а здесь получается, что тема уходит в другую плоскость и главная проблема теряется из виду.
Да она давно уже ушла. Главная тема вообще была про потоки и чтение в буфер. И что QString, что наследование std::string к ней не относятся в равной степени.

Добавлено через 11 минут
Цитата Сообщение от Tulosba Посмотреть сообщение
что же ты делаешь! Так нельзя.
А про "так нельзя" это слишком самоуверенно. Хотя бы потому, что автор (даже не обязательно наш ТС) не обязательно студент и не обязательно у него там есть особый выбор инструментов. Он может быть заложником ситуации, legacy код и все дела. А ты ему "дорогой, ты делаешь все неправильно. Тут все надо переделать и вообще использовать С++11, да еще и бустом присыпать.".
Другое дело когда автор пишет вообще какую-то ахинею, которая ни при каких обстоятельствах работать не будет - тут вот можно сказать "так нельзя". Но откровенной ахинеи лично я здесь не вижу. Спорные моменты есть конечно, но форумы для того и есть, чтобы каждый мог высказаться. Вот тебе показалось это неправильным, скажи это ТС, возможно он и прислушается.
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
07.05.2014, 22:54 36
Цитата Сообщение от DrOffset Посмотреть сообщение
80% ответов на этом форуме совсем не о том, о чем спрашивали.
Ага. И мы продолжаем этот процент увеличивать прямо сейчас
Цитата Сообщение от DrOffset Посмотреть сообщение
Будешь утверждать, что мой ответ был бесполезен и автор ничего нового не почерпнул?
Не буду. Но некоторые моменты режут глаз. Типа как объяснить устройство автомобиля, но не уточнить, что нельзя заливать бензин в дизельный двигатель и наоборот.
Цитата Сообщение от DrOffset Посмотреть сообщение
Да она давно уже ушла.
Вот я тоже посмотрел на название темы и вижу, что разговор совсем уже о другом.
Цитата Сообщение от DrOffset Посмотреть сообщение
И что QString, что наследование std::string к ней не относятся в равной степени.
Я отвечал на конкретный вопрос, как оказалось у автора в этой теме были пробелы. (с)
Цитата Сообщение от DrOffset Посмотреть сообщение
Вот тебе показалось это неправильным, скажи это ТС, возможно он и прислушается.
Я не думаю, что если я сказал это, обращаясь к тебе, а не ТС, он не сможет уловить сути
Цитата Сообщение от DrOffset Посмотреть сообщение
А про "так нельзя" это слишком самоуверенно.
В случае публичного наследования от std::string это факт.
0
18836 / 9837 / 2406
Регистрация: 30.01.2014
Сообщений: 17,275
07.05.2014, 22:59 37
Цитата Сообщение от Tulosba Посмотреть сообщение
обращаясь к тебе, а не ТС, он не сможет уловить сути
Как минимум у него не появится уведомление о том, что кто-то к нему обратился.
Цитата Сообщение от Tulosba Посмотреть сообщение
Я отвечал на конкретный вопрос, как оказалось у автора в этой теме были пробелы.
Мимо. Я отвечал вот на этот вопрос:
Цитата Сообщение от OrmaJever Посмотреть сообщение
То есть родительские методы переносятся частично, да я смогу к обьекту HL::string применить родительский метод append, но с операторами и конструкторами такая вот беда. Я один считаю что это не правильно?
Как видишь, он не имеет прямого отношения к наследованию std::string.
Цитата Сообщение от Tulosba Посмотреть сообщение
Но некоторые моменты режут глаз. Типа как объяснить устройство автомобиля, но не уточнить, что нельзя заливать бензин в дизельный двигатель и наоборот.
Цитата Сообщение от DrOffset Посмотреть сообщение
форумы для того и есть, чтобы каждый мог высказаться.
Дополняй, если есть что сказать
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
07.05.2014, 23:04 38
Цитата Сообщение от DrOffset Посмотреть сообщение
Как минимум у него не появится уведомление о том, что кто-то к нему обратился.
А вот ты о чем... я отключил эту фичу как только она появилась
Цитата Сообщение от DrOffset Посмотреть сообщение
Дополняй, если есть что сказать
Пойду по другим темам пройдусь. Тут уже всё понятно.
0
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
18836 / 9837 / 2406
Регистрация: 30.01.2014
Сообщений: 17,275
07.05.2014, 23:49 40
Цитата Сообщение от OrmaJever Посмотреть сообщение
я со слезами на глазах менял char * на std::string и потерял при этом ~10% скорости
А чем конкретно это было вызвано удалось понять?
Очень большая цифра 10%, есть мнение, что ее можно сократить весьма значительно.
0
07.05.2014, 23:49
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.05.2014, 23:49
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru