Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.62
underwaterspace
2 / 2 / 0
Регистрация: 29.01.2013
Сообщений: 47
#1

write - C++

11.08.2013, 21:46. Просмотров 1947. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.08.2013, 21:46
Здравствуйте! Я подобрал для вас темы с ответами на вопрос write (C++):

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

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

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

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

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

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

4
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
12.08.2013, 00:06 #2
underwaterspace, Файл-то как бэ бинарный. Вы записываете сначала длину, потом содержимое строки. Для проверки правильно-ли записалось рекомендую сделать метод считывания. Ну или посмотреть через хекс редактор, если есть навыки.
Кстати, открывать файл в данном случае лучше, указывая флаг std::ios::binary.
0
underwaterspace
2 / 2 / 0
Регистрация: 29.01.2013
Сообщений: 47
12.08.2013, 16:16  [ТС] #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;
}
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
12.08.2013, 19:15 #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;
}
1
DiffEreD
1431 / 768 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
12.08.2013, 20:54 #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;
}
0
12.08.2013, 20:54
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.08.2013, 20:54
Привет! Вот еще темы с ответами:

Write a program to perform the following operations - C++
Write a program to perform the following operations: a) Create an integer array of floating point numbers. b) Finding and removing...

Функция write open не работает - C++
В общем вот алгорифм #include &lt;iostream&gt; //Все нужные библиотеки есть int main() { int id; char buffer; ...

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

Write a program that performs operations - C++
Write a program that performs operations: a) Create an array, each element of which contains the angle in radians. b) Sort the array in...


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

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

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