Форум программистов, компьютерный форум CyberForum.ru

write - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.62
underwaterspace
2 / 2 / 0
Регистрация: 29.01.2013
Сообщений: 47
11.08.2013, 21:46     write #1
Нужно записать данные контейнера в файл:
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);
Правильно ли это(брал из задания)?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.08.2013, 21:46     write
Посмотрите здесь:

как работает write в fstream? C++
вопрос по ostream::write(). C++
Ошибка в строке file.write C++
C++ copy on write оптимизация
C++ read(); write();
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
12.08.2013, 00:06     write #2
underwaterspace, Файл-то как бэ бинарный. Вы записываете сначала длину, потом содержимое строки. Для проверки правильно-ли записалось рекомендую сделать метод считывания. Ну или посмотреть через хекс редактор, если есть навыки.
Кстати, открывать файл в данном случае лучше, указывая флаг std::ios::binary.
underwaterspace
2 / 2 / 0
Регистрация: 29.01.2013
Сообщений: 47
12.08.2013, 16:16  [ТС]     write #3
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;
}
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
12.08.2013, 19:15     write #4
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;
}
DiffEreD
 Аватар для DiffEreD
1420 / 757 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
12.08.2013, 20:54     write #5
Возможно, такой вариант подойдет по условию задачи:
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;
}
Yandex
Объявления
12.08.2013, 20:54     write
Ответ Создать тему
Опции темы

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