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

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

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

Студворк — интернет-сервис помощи студентам
В общем мне казалась задача вполне очевидна и частая считать файл целиком в строку, но почему-то я не нашёл ничего готового (типа fstream::readAll()).
Оператор >> игнорирует пробельные символы, вычитал отсюда fstream - символ пробела что можно использовать getline, но меня смущает что туда нужно передавать буфер заранее известного размеры, вам не кажется что это как-то дико и в Си стиле? По-моему в современном мире функция должна сама создать буфер и вернуть мне его. В общем как вы читаете весь файл и затем записываете его в переменную?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
06.05.2014, 23:29
Ответы с готовыми решениями:

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

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

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

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

Добавлено через 2 минуты
OrmaJever, и да, тестирование которое проведено в статье, сломало оптимизацию. Поэтому получились такие хреновые результаты.
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
08.05.2014, 00:10
Цитата Сообщение от Croessmah Посмотреть сообщение
но который по сути может быть чем угодно, так зачем жестко цеплять istream к string.
Кроме того, если файл содержит символы "NULL" то в std::string запишеться только часть...
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
08.05.2014, 00:16
Цитата Сообщение от Avazart Посмотреть сообщение
Кроме того, если файл содержит символы "NULL" то в std::string
Это смотря как записывать Вообще std::string потенциально может хранить бинарные данные. Некоторые либины, например google :: protobuf, активно этим пользуются. Хотя мне лично такой use-case не очень по душе.
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
08.05.2014, 00:24
Как уже сказали наследоваться от 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
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
08.05.2014, 00:34
Цитата Сообщение от Avazart Посмотреть сообщение
C++
1
2
3
4
char* с_str()
* * *{
* * * * retrun impl_.с_str(); * 
* * *}
так тоже не хорошо
с_str возвращает const char*
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
08.05.2014, 00:51
Цитата Сообщение от 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
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
08.05.2014, 00:57
Цитата Сообщение от 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
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
08.05.2014, 00:57
Ну в принципе понятно я запарился сhar
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
08.05.2014, 00:59
Цитата Сообщение от Avazart Посмотреть сообщение
Что касается NULL и std::string
Я же сказал "смотря как записывать". Метод с operator= естественно будет ориентироваться только на ноль, у него же нет никаких других маркеров ограничения. См. мой пример, короче
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
08.05.2014, 01:00
Avazart, \067 это вообще-то восьмеричная константа. Даже выделение кода это показало. Со всеми вытекающими.
0
 Аватар для Super-Hacker
342 / 114 / 37
Регистрация: 26.11.2019
Сообщений: 735
06.06.2020, 19:12
C++
1
2
3
    while(getline(fin, c)){
        s += c;
    }
Чем не вариант?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
06.06.2020, 19:12
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
52
Ответ Создать тему
Новые блоги и статьи
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru