Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.93
OrmaJever
9 / 9 / 3
Регистрация: 10.11.2011
Сообщений: 241
#1

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

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

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

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

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

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

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

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

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

50
OrmaJever
9 / 9 / 3
Регистрация: 10.11.2011
Сообщений: 241
07.05.2014, 23:56  [ТС] #41
Цитата Сообщение от DrOffset Посмотреть сообщение
А чем конкретно это было вызвано удалось понять?
не удалось, потому что я переписывал не поэтапно, а всё сразу и поэтому просто сравнил время ДО и ПОСЛЕ, и получилось вот так. Возможно конечно я реализовал не идеально, но факт есть фактом, хотя я этому даже не удивлён, особенно после прочтения этой статьи http://habrahabr.ru/post/175691/
0
DrOffset
7518 / 4514 / 1097
Регистрация: 30.01.2014
Сообщений: 7,362
08.05.2014, 00:10 #42
Цитата Сообщение от OrmaJever Посмотреть сообщение
не удалось, потому что я переписывал не поэтапно, а всё сразу и поэтому просто сравнил время ДО и ПОСЛЕ, и получилось вот так.
Я бы натравил профайлер и посмотрел где именно проседает производительность.
Цитата Сообщение от OrmaJever Посмотреть сообщение
хотя я этому даже не удивлён, особенно после прочтения этой статьи
Там есть весьма интересные апдейты, касающиеся С++11 В частности в С++11 стандартом явно запрещено использование методики c подсчетом ссылок для реализации std::string.

Добавлено через 2 минуты
OrmaJever, и да, тестирование которое проведено в статье, сломало оптимизацию. Поэтому получились такие хреновые результаты.
0
Avazart
Эксперт С++
7683 / 5592 / 543
Регистрация: 10.12.2010
Сообщений: 25,073
Записей в блоге: 17
08.05.2014, 00:10 #43
Цитата Сообщение от Croessmah Посмотреть сообщение
но который по сути может быть чем угодно, так зачем жестко цеплять istream к string.
Кроме того, если файл содержит символы "NULL" то в std::string запишеться только часть...
0
DrOffset
7518 / 4514 / 1097
Регистрация: 30.01.2014
Сообщений: 7,362
08.05.2014, 00:16 #44
Цитата Сообщение от Avazart Посмотреть сообщение
Кроме того, если файл содержит символы "NULL" то в std::string
Это смотря как записывать Вообще std::string потенциально может хранить бинарные данные. Некоторые либины, например google :: protobuf, активно этим пользуются. Хотя мне лично такой use-case не очень по душе.
0
Avazart
Эксперт С++
7683 / 5592 / 543
Регистрация: 10.12.2010
Сообщений: 25,073
Записей в блоге: 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
Jupiter
Каратель
Эксперт С++
6568 / 3989 / 400
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
08.05.2014, 00:34 #46
Цитата Сообщение от Avazart Посмотреть сообщение
C++
1
2
3
4
char* с_str()
* * *{
* * * * retrun impl_.с_str(); * 
* * *}
так тоже не хорошо
с_str возвращает const char*
0
Avazart
Эксперт С++
7683 / 5592 / 543
Регистрация: 10.12.2010
Сообщений: 25,073
Записей в блоге: 17
08.05.2014, 00:51 #47
Цитата Сообщение от Jupiter Посмотреть сообщение
так тоже не хорошо
Ну я не помню что он там возвращает, не суть.

DrOffset, Что касается NULL и std::string :

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
    #include <string>
    #include <iostream>
     
    int main()
    {
    char ch[11]= "01234\06789\0";
     
    std::string s= ch;
     
    for(size_t i=0; i<s.size(); ++i)
    {
    if(s[i]!='\0')
    std::cout<<s[i]<<std::endl;
    else
    std::cout<<"NULL"<<std::endl;
    }
     
    std::cout<<"end";
    getchar();
    return 0;
    }
Вывод
0
1
2
3
4
7
8
9
end

http://ideone.com/vEBiVQ
0
DrOffset
7518 / 4514 / 1097
Регистрация: 30.01.2014
Сообщений: 7,362
08.05.2014, 00:57 #48
Цитата Сообщение от Avazart Посмотреть сообщение
Я не помню нюансов, но помню что с этим были проблемы
Ну проблем там особых нет, если помнить, что определенные методы при таком использовании будут не так работать.
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 <string>
#include <iostream>
#include <iterator>
 
int main()
{
    char buf[] = { 'a', 'b', '\0', 'c', 'd', '\0' };
 
    std::string str;
 
    // запишет до первого нуля
    str = buf;
    std::cout << str.size() << std::endl;   // выведет 2
 
    // запишет всю последовательность
    str.assign(buf, sizeof(buf));
    std::cout << str.size() << std::endl;   // выведет 6
 
    std::cout << str.c_str() << std::endl; //выведет только ab, хотя содержимое больше
 
    // выведет всю последовательность
    std::copy(str.begin(), str.end(), std::ostream_iterator<char>(std::cout));
}
0
Avazart
Эксперт С++
7683 / 5592 / 543
Регистрация: 10.12.2010
Сообщений: 25,073
Записей в блоге: 17
08.05.2014, 00:57 #49
Ну в принципе понятно я запарился сhar
0
DrOffset
7518 / 4514 / 1097
Регистрация: 30.01.2014
Сообщений: 7,362
08.05.2014, 00:59 #50
Цитата Сообщение от Avazart Посмотреть сообщение
Что касается NULL и std::string
Я же сказал "смотря как записывать". Метод с operator= естественно будет ориентироваться только на ноль, у него же нет никаких других маркеров ограничения. См. мой пример, короче
0
Tulosba
:)
Эксперт С++
4746 / 3240 / 496
Регистрация: 19.02.2013
Сообщений: 9,046
08.05.2014, 01:00 #51
Avazart, \067 это вообще-то восьмеричная константа. Даже выделение кода это показало. Со всеми вытекающими.
0
08.05.2014, 01:00
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.05.2014, 01:00
Привет! Вот еще темы с решениями:

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

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

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

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


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

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

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