Форум программистов, компьютерный форум 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, но меня смущает что туда нужно передавать буфер заранее известного размеры, вам не кажется что это как-то дико и в Си стиле? По-моему в современном мире функция должна сама создать буфер и вернуть мне его. В общем как вы читаете весь файл и затем записываете его в переменную?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
OrmaJever
 Аватар для OrmaJever
9 / 9 / 0
Регистрация: 10.11.2011
Сообщений: 241
07.05.2014, 23:56  [ТС]     Чтение всего файла fstream #41
Цитата Сообщение от DrOffset Посмотреть сообщение
А чем конкретно это было вызвано удалось понять?
не удалось, потому что я переписывал не поэтапно, а всё сразу и поэтому просто сравнил время ДО и ПОСЛЕ, и получилось вот так. Возможно конечно я реализовал не идеально, но факт есть фактом, хотя я этому даже не удивлён, особенно после прочтения этой статьи http://habrahabr.ru/post/175691/
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DrOffset
6423 / 3797 / 878
Регистрация: 30.01.2014
Сообщений: 6,586
08.05.2014, 00:10     Чтение всего файла fstream #42
Цитата Сообщение от OrmaJever Посмотреть сообщение
не удалось, потому что я переписывал не поэтапно, а всё сразу и поэтому просто сравнил время ДО и ПОСЛЕ, и получилось вот так.
Я бы натравил профайлер и посмотрел где именно проседает производительность.
Цитата Сообщение от OrmaJever Посмотреть сообщение
хотя я этому даже не удивлён, особенно после прочтения этой статьи
Там есть весьма интересные апдейты, касающиеся С++11 В частности в С++11 стандартом явно запрещено использование методики c подсчетом ссылок для реализации std::string.

Добавлено через 2 минуты
OrmaJever, и да, тестирование которое проведено в статье, сломало оптимизацию. Поэтому получились такие хреновые результаты.
Avazart
 Аватар для Avazart
6897 / 5137 / 252
Регистрация: 10.12.2010
Сообщений: 22,573
Записей в блоге: 17
08.05.2014, 00:10     Чтение всего файла fstream #43
Цитата Сообщение от Croessmah Посмотреть сообщение
но который по сути может быть чем угодно, так зачем жестко цеплять istream к string.
Кроме того, если файл содержит символы "NULL" то в std::string запишеться только часть...
DrOffset
6423 / 3797 / 878
Регистрация: 30.01.2014
Сообщений: 6,586
08.05.2014, 00:16     Чтение всего файла fstream #44
Цитата Сообщение от Avazart Посмотреть сообщение
Кроме того, если файл содержит символы "NULL" то в std::string
Это смотря как записывать Вообще std::string потенциально может хранить бинарные данные. Некоторые либины, например google :: protobuf, активно этим пользуются. Хотя мне лично такой use-case не очень по душе.
Avazart
 Аватар для Avazart
6897 / 5137 / 252
Регистрация: 10.12.2010
Сообщений: 22,573
Записей в блоге: 17
08.05.2014, 00:24     Чтение всего файла fstream #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 потенциально может хранить бинарные данные.
Я не помню нюансов, но помню что с этим были проблемы, поэтому использовал как и рекомендуют вектор символов.
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
08.05.2014, 00:34     Чтение всего файла fstream #46
Цитата Сообщение от Avazart Посмотреть сообщение
C++
1
2
3
4
char* с_str()
* * *{
* * * * retrun impl_.с_str(); * 
* * *}
так тоже не хорошо
с_str возвращает const char*
Avazart
 Аватар для Avazart
6897 / 5137 / 252
Регистрация: 10.12.2010
Сообщений: 22,573
Записей в блоге: 17
08.05.2014, 00:51     Чтение всего файла fstream #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
DrOffset
6423 / 3797 / 878
Регистрация: 30.01.2014
Сообщений: 6,586
08.05.2014, 00:57     Чтение всего файла fstream #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));
}
Avazart
 Аватар для Avazart
6897 / 5137 / 252
Регистрация: 10.12.2010
Сообщений: 22,573
Записей в блоге: 17
08.05.2014, 00:57     Чтение всего файла fstream #49
Ну в принципе понятно я запарился сhar
DrOffset
6423 / 3797 / 878
Регистрация: 30.01.2014
Сообщений: 6,586
08.05.2014, 00:59     Чтение всего файла fstream #50
Цитата Сообщение от Avazart Посмотреть сообщение
Что касается NULL и std::string
Я же сказал "смотря как записывать". Метод с operator= естественно будет ориентироваться только на ноль, у него же нет никаких других маркеров ограничения. См. мой пример, короче
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.05.2014, 01:00     Чтение всего файла fstream
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
Tulosba
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
08.05.2014, 01:00     Чтение всего файла fstream #51
Avazart, \067 это вообще-то восьмеричная константа. Даже выделение кода это показало. Со всеми вытекающими.
Yandex
Объявления
08.05.2014, 01:00     Чтение всего файла fstream
Ответ Создать тему
Опции темы

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