Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.69/13: Рейтинг темы: голосов - 13, средняя оценка - 4.69
2 / 2 / 1
Регистрация: 29.01.2013
Сообщений: 47

write

11.08.2013, 21:46. Показов 2654. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Нужно записать данные контейнера в файл:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include<iostream>
#include<string>
#include<vector>
#include<fstream>
#include<iterator>
#include<algorithm>
using namespace std;
class Store
{
public:
    ofstream & name;
    Store(ofstream & h):name(h){};
    void operator()(const string & );
};
void Store::operator () (const string & j)
{
    int len=j.size();
 
    name.write((char *)&len, sizeof(size_t));
    name.write(j.data(), len);
}
void Show(string &);
int main()
{
    vector<string> kom;
    string temp;
    while(getline(cin,temp) && temp[0]!='\0')
        kom.push_back(temp);
 
    ofstream ofs("1.txt");
for_each(kom.begin(),kom.end(),Store(ofs));
    for_each(kom.begin(),kom.end(),Show);
    ofs.close();
    system("PAUSE");
    return 0;
}
void Show(string & a)
{
cout<<a<<endl;
}
В файле получаю большие пробелы между содержимым и какой-то невнятный символ после каждого элемента.
Отсюда вопрос
C++
1
2
    name.write((char *)&len, sizeof(size_t));
    name.write(j.data(), len);
Правильно ли это(брал из задания)?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
11.08.2013, 21:46
Ответы с готовыми решениями:

read(); write();
Вот такая вот небольшая программка fstream myFileReader(&quot;hardware.dat&quot;, ios::in | ios::out); int example = 1; ...

Write из Pascal в C++
Добрый вечер уважаемые форумчане. Подскажите пож. как переделать код на C++ из Pascal WRITE( Inp:2:0 ); WRITELN(' ...

Write из fstream
Здравствуйте!) Не могу понять, как пишет данные в файл функция write( То есть мы с помощью seekp указали позицию в потоке (файле) и...

4
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
12.08.2013, 00:06
underwaterspace, Файл-то как бэ бинарный. Вы записываете сначала длину, потом содержимое строки. Для проверки правильно-ли записалось рекомендую сделать метод считывания. Ну или посмотреть через хекс редактор, если есть навыки.
Кстати, открывать файл в данном случае лучше, указывая флаг std::ios::binary.
0
2 / 2 / 1
Регистрация: 29.01.2013
Сообщений: 47
12.08.2013, 16:16  [ТС]
ForEveR, я надеялся, что через текстовой смогу проверить запись. Можете подсказать, как считать информацию из бинарного файла в данном случае:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#include<iostream>
#include<string>
#include<vector>
#include<fstream>
#include<algorithm>
using namespace std;
static int k=0;
class Store
{
public:
    ofstream & name;
    Store(ofstream & h):name(h){};
    void operator()(const string & );
};
void Store::operator () (const string & j)
{
    int len=j.size();
    name.write((char *)&len, sizeof(len));
    name.write(j.data(), len);
    k+=len;
}
void GetStrs(ifstream &,vector<string> &);
void Show(string &);
int main()
{
    vector<string> kom;
    string temp;
    while(getline(cin,temp) && temp[0]!='\0')
        kom.push_back(temp);
 
    ofstream ofs("1.dat",ios::binary);
    for_each(kom.begin(),kom.end(),Store(ofs));
 
    ifstream ifs("1.dat",ios::binary);
    vector<string> fd;
    GetStrs(ifs,fd);
    for_each(fd.begin(),fd.end(),Show);
    ofs.close();
    system("PAUSE");
    return 0;
}
void GetStrs(ifstream & b,vector<string> & a)
{
    string ch;
    b.read((char*)&k,sizeof(k)*k);
    while(b.read((char*)&ch,ch.size()))
    {
        b>>ch;
        a.push_back(ch.data());
    }
}
void Show(string & a)
{
    cout<<a<<endl;
}
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
12.08.2013, 19:15
C++
1
2
3
4
5
6
    b.read((char*)&k,sizeof(k)*k);
    while(b.read((char*)&ch,ch.size()))
    {
        b>>ch;
        a.push_back(ch.data());
    }
И что здесь происходит? Нужно считать через read размер строки - создать буфер данного размера - считать в буфер данные - создать строку из этих данных.

C++
1
2
3
4
5
6
7
8
9
while (!b.eof())
{
   int size = 0;
   b.read((char*)&size, sizeof(size));
   char* buffer = new char[size];
   b.read(buffer, size);
   a.push_back(string(buffer, size));
   delete[] buffer;
}
1
 Аватар для DiffEreD
1458 / 795 / 257
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
12.08.2013, 20:54
Возможно, такой вариант подойдет по условию задачи:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include <algorithm>
#include <windows.h>
 
class ReadWrite
{
protected:
    std::fstream& stream_;
    std::string::size_type length;
public:
    ReadWrite(std::fstream& fs) : stream_(fs), length(0) {}
    virtual ~ReadWrite() = 0;
};
 
ReadWrite::~ReadWrite() {}
 
class Write : public ReadWrite
{
public:
    Write(std::fstream& fs) : ReadWrite(fs) {}
    void operator()(const std::string& obj)
    {
        length = obj.size();
        stream_.write((const char*)&length, sizeof(length)).write(obj.data(), length);
    }
};
 
class Read : public ReadWrite
{
public:
    Read(std::fstream& fs) : ReadWrite(fs) {}
    void operator()(std::string& obj)
    {
        if (stream_.read((char*)&length, sizeof(length)))
        {
            obj.resize(length);
            stream_.read(&obj[0], length);
        }
    }
};
 
int main()
{
    SetConsoleCP (1251); SetConsoleOutputCP (1251);
 
    std::vector<std::string> words {"One", "Two", "Three", "Four"};
    std::fstream fs("file.bin", std::ios_base::out | std::ios_base::binary);
    std::for_each(words.begin(), words.end(), Write(fs));
    fs.close();
 
    std::vector<std::string> words_from_file(words.size());
    fs.open("file.bin", std::ios_base::in | std::ios_base::binary);
    std::for_each(words_from_file.begin(), words_from_file.end(), Read(fs));
    fs.close();
 
    for (auto& str : words_from_file) std::cout << str << std::endl;
 
    std::cout << std::endl;
    return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
12.08.2013, 20:54
Помогаю со студенческими работами здесь

Функции write и read
Здравствуйте, уважаемые! Вопросы по работе с файлом через fstream. Возник вопрос по поводу записи структуры в нужном месте файла....

copy on write оптимизация
Требуется сделать copy on write оптимизацию, но я не знаю как мне верно перенаправлять указатели / ссылки :( Оптимизация состоит в том,...

вопрос по ostream::write().
ostream&amp; ostream::write ( const char* s , streamsize n ); почему эта функция получает первым аргументом указатель на чар? в смысле не...

Read and write binary file
Ребята, срочно нужна помощь. Записываю класс Message с сообщениями в файл. struct Head { public: int who; int to; ...

Ошибка при использовании write()
Ребят есть код, запись информации в файл. #include &lt;stdio.h&gt; #include &lt;string&gt; #include &lt;iostream&gt; #include &lt;locale.h&gt;...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
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 На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru