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

Можно ли записывать объекты класса string в память, чтоб потом их прочитать? - C++

Восстановить пароль Регистрация
 
Асурус
2 / 2 / 1
Регистрация: 27.07.2012
Сообщений: 40
15.05.2013, 01:16     Можно ли записывать объекты класса string в память, чтоб потом их прочитать? #1
Создал класс, который содержит много объектов класса string, но что то не так как надо. В debug режиме удаётся прочитать и вывести, но компилятор после этого выдаёт что-то нехорошее. В режиме release даже не выводит на экран строки. Можно ли вообще объекты класса string просто записать как outfile.write(reinterpret_cast<char*>(&dummyobj), sizeof(dummyobj)), а потом прочитать как infile.read(reinterpret_cast<char*>(&dummyobj), sizeof(dummyobj))?

Добавлено через 13 минут
Компилятор совсем странно себя ведёт. Сейчас в release всё нормально, а вот debug застревает. Я пытаюсь прочитать данные после записи, в новой программе.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.05.2013, 01:16     Можно ли записывать объекты класса string в память, чтоб потом их прочитать?
Посмотрите здесь:

как вытащить из for(...){...; b=5;...} переменную b с новым значением чтоб потом ее использовать C++
C++ Задача : сохранить несколько чисел в файле и потом их прочитать
C++ Как используя C-String а потом и String class варьировать вывод?
C++ как можно прочитать файл в обратном порядке т.е. стать в конец файла и прочитать до начальной позиции?
Методы класса, как лучше записывать C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
15.05.2013, 01:25     Можно ли записывать объекты класса string в память, чтоб потом их прочитать? #2
Цитата Сообщение от Асурус Посмотреть сообщение
Можно ли вообще объекты класса string просто записать как outfile.write(reinterpret_cast<char*>(&dummyobj), sizeof(dummyobj)), а потом прочитать как infile.read(reinterpret_cast<char*>(&dummyobj), sizeof(dummyobj))?
Нет, нельзя, записывай каждую строку отдельно.
stima
430 / 285 / 16
Регистрация: 22.03.2011
Сообщений: 929
Завершенные тесты: 1
15.05.2013, 01:28     Можно ли записывать объекты класса string в память, чтоб потом их прочитать? #3
C++
1
str.size() * sizeof(std::string::value_type); //str.size() * sizeof(char)
Асурус
2 / 2 / 1
Регистрация: 27.07.2012
Сообщений: 40
15.05.2013, 01:31  [ТС]     Можно ли записывать объекты класса string в память, чтоб потом их прочитать? #4
Во втором ответе почти ничего не понял, но спасибо за труды.
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
15.05.2013, 12:27     Можно ли записывать объекты класса string в память, чтоб потом их прочитать? #5
stima, sizeof(char) равен 1 по определению.
stima
430 / 285 / 16
Регистрация: 22.03.2011
Сообщений: 929
Завершенные тесты: 1
15.05.2013, 13:26     Можно ли записывать объекты класса string в память, чтоб потом их прочитать? #6
2Tulosba И?)) Есть такое понятие лучше явное чем не явное.
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
15.05.2013, 13:43     Можно ли записывать объекты класса string в память, чтоб потом их прочитать? #7
stima, явное умножение на 1 лучше, чем отсутствие этого умножения?
stima
430 / 285 / 16
Регистрация: 22.03.2011
Сообщений: 929
Завершенные тесты: 1
15.05.2013, 13:57     Можно ли записывать объекты класса string в память, чтоб потом их прочитать? #8
умножение на sizeof(char) лучше чем без, а вдург завтра выйдет стандарт говорящий что char может быть от 1 до 3?)
Croessmah
15.05.2013, 13:59
  #9

Не по теме:

Цитата Сообщение от stima Посмотреть сообщение
стандарт говорящий что char может быть от 1 до 3?)
не волнуйтесь - не выйдет

Цитата Сообщение от Tulosba Посмотреть сообщение
явное умножение на 1 лучше, чем отсутствие этого умножения?
Скорее всего это просто будет вырезано компилятором как рудимент

Tulosba
15.05.2013, 14:07
  #10

Не по теме:

Цитата Сообщение от stima Посмотреть сообщение
а вдург завтра выйдет стандарт говорящий что char может быть от 1 до 3?)
главное чтоб не 0.5

Асурус
2 / 2 / 1
Регистрация: 27.07.2012
Сообщений: 40
15.05.2013, 23:00  [ТС]     Можно ли записывать объекты класса string в память, чтоб потом их прочитать? #11
А объект класса string вообще в память можно записать?

Добавлено через 51 секунду
Я имею ввиду, чтобы потом, при новом запуске программы считать его без проблем?
stima
430 / 285 / 16
Регистрация: 22.03.2011
Сообщений: 929
Завершенные тесты: 1
15.05.2013, 23:40     Можно ли записывать объекты класса string в память, чтоб потом их прочитать? #12
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
#include <string>
#include <fstream>
#include <iostream>
 
int main()
{
    std::fstream fs;
    std::string str = "Data";
 
    fs.open("file.txt", std::fstream::out);
    if (!fs.is_open())
         return 1;
  
    fs << str;
 
    str.clear();
    fs.close();
 
    fs.open("file.txt", std::fstream::in);
    if (!fs.is_open())
         return 1;
    
    fs >> str;
    std::cout << str << std::endl;
    
    return 0;
}
Асурус
2 / 2 / 1
Регистрация: 27.07.2012
Сообщений: 40
15.05.2013, 23:56  [ТС]     Можно ли записывать объекты класса string в память, чтоб потом их прочитать? #13
Да, это всё понятно, но только ничего не работает, если например взять другой объект класса string, не тот, который использовали для записи. Так же будет, если запустить программу и не записывая, считать данные. У меня никак не получалось прочитать информацию, работало только до первых трёх символов, я и обычно использую не текстовое сохронение, а бинарное.
stima
430 / 285 / 16
Регистрация: 22.03.2011
Сообщений: 929
Завершенные тесты: 1
16.05.2013, 00:14     Можно ли записывать объекты класса string в память, чтоб потом их прочитать? #14
Я не телепат код в студию
Асурус
2 / 2 / 1
Регистрация: 27.07.2012
Сообщений: 40
16.05.2013, 01:06  [ТС]     Можно ли записывать объекты класса string в память, чтоб потом их прочитать? #15
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
#include "stdafx.h"
#include <string>
#include <fstream>
#include <iostream>
 
int main()
{
    std::fstream fs;
    std::string str = "Data", str2;
 
    fs.open("file.txt", std::fstream::out);
    if (!fs.is_open())
         return 1;
  
    fs << str;
 
    str.clear();
    fs.close();
 
    fs.open("file.txt", std::fstream::in);
    if (!fs.is_open())
         return 1;
    
    fs >> str2;
    std::cout << str << std::endl;
    
    system("pause");
    return 0;
}
stima
430 / 285 / 16
Регистрация: 22.03.2011
Сообщений: 929
Завершенные тесты: 1
16.05.2013, 01:10     Можно ли записывать объекты класса string в память, чтоб потом их прочитать? #16
Вы издеваетесь? Вы привели мне мой же код?

Цитата Сообщение от Асурус Посмотреть сообщение
У меня никак не получалось прочитать информацию, работало только до первых трёх символов, я и обычно использую не текстовое сохронение, а бинарное.
Где это?
Асурус
2 / 2 / 1
Регистрация: 27.07.2012
Сообщений: 40
16.05.2013, 02:05  [ТС]     Можно ли записывать объекты класса string в память, чтоб потом их прочитать? #17
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
#include "stdafx.h"
#include <string>
#include <fstream>
using namespace std;
#include <iostream>
 
int main()
{
    fstream fs;
    string str = "Data", str2;
 
    fs.open("file.dat", ios::out | ios::binary);
    if (!fs.is_open())
         return 1;
  
    fs.write(reinterpret_cast<char*>(&str), sizeof(str));
 
 //   str.clear();
    fs.close();
 
    fs.open("file.txt", ios::in | ios::binary);
    if (!fs.is_open())
         return 1;
    
    fs.read(reinterpret_cast<char*>(&str2), sizeof(str));
    cout << str2 << endl;
    
    system("pause");
    return 0;
}
Извините...
Да, с текстовым документом всё было нормально, только вот здесь, я адаптировал ваш пример под своё понимание... Мой личный пример делает всё так же как и здесь, но он слишком длинный.

Добавлено через 1 минуту
Ой... опять ошибка )

Добавлено через 1 минуту
В общем <iostream> переносится повыше, но результат от этого не меняется...

Добавлено через 35 минут
Да, вот ещё, указываю вместо sizeof(str) str.size(), всё равно не получается.
stima
430 / 285 / 16
Регистрация: 22.03.2011
Сообщений: 929
Завершенные тесты: 1
16.05.2013, 02:22     Можно ли записывать объекты класса string в память, чтоб потом их прочитать? #18
Вы знаете что sizeof это размер типа?
C++
1
2
3
4
5
6
7
class A          // это тип класс А
{ 
     int a;       // это тип int 
     int b;       // это тип тоже int
};
sizeof(A) == sizeof(int) + sizeof(int) // размер класса это размер всех его переменных 
                                                 //+ втб + выравнивание, но об этом узнаешь позже
Вы понимаете что с std::string это класс удобными методами доступа к char* (где char* это массив char)?
А значит для std::string (припустим он реализован так, ведь мы можем написать свой!)) главное интерфейс)))
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
namespace std
{
template<....>
class string
{
 
 
private:
   char *buff;                 // это тип указатель
   int size;                     // это тип int
   int capacity;               // это тип int
};
}
 
sizeof(std::string) == sizeof(char*) + sizeof(int) + sizeof(int)

Вы понимаете что
C++
1
std::string str ("1234567890");
Это 10 раз по char == str.size() * sizeof(char)

Со всем вышесказанным можно подитожить
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
#include <string>
#include <fstream>
#include <iostream>
 
using namespace std;
 
int main()
{
    fstream fs;
    string str = "Data", str2;
 
    fs.open("file.dat", ios::out | ios::binary);
    if (!fs.is_open())
         return 1;
  
    fs.write(str.c_str(), str.size() * sizeof(char));
    fs.close();
 
    fs.open("file.dat", ios::in | ios::binary);
    if (!fs.is_open())
         return 1;
    
    str2.resize(str.size());
    fs.read(&str2[0], str.size() * sizeof(char));
 
    cout << str2 << endl;
    std::cin.get();
 
    return 0;
}
ssXXss
263 / 185 / 10
Регистрация: 15.01.2011
Сообщений: 668
16.05.2013, 02:51     Можно ли записывать объекты класса string в память, чтоб потом их прочитать? #19
Цитата Сообщение от Асурус Посмотреть сообщение
А объект класса string вообще в память можно записать?
можно записать в память обьект string и спокойно с ним работать вот маленький изврат на эту тему : )))
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
...
typedef unsigned char byte;
void main()
{
       std::string str("333333333333333333333333333333");
 
    void* newstr = (void*)new byte[sizeof(str)];
    memset(newstr,0,sizeof(str));
    memcpy(newstr,&str,sizeof(str));
 
    std::cout << ((std::string*)newstr)->c_str() <<endl;
 
    ((std::string*)newstr)->clear();
 
    *((std::string*)newstr) += "zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz";
 
     std::cout << ((std::string*)newstr)->c_str() <<endl;
 
}
// вывод :
// 333333333333333333333333333333
// zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.05.2013, 05:34     Можно ли записывать объекты класса string в память, чтоб потом их прочитать?
Еще ссылки по теме:

Разработать другую версию предыдущей задачи используя объекты класса String C++
C++ Классы и объекты в С++, компонента класса и экземпляр класса
C++ Можно ли выделять память под объект класса с помощью функций calloc, malloc или realloc?

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

Или воспользуйтесь поиском по форуму:
Асурус
2 / 2 / 1
Регистрация: 27.07.2012
Сообщений: 40
16.05.2013, 05:34  [ТС]     Можно ли записывать объекты класса string в память, чтоб потом их прочитать? #20
stima, Спасибо за детальное объяснение, я конечно не всё понял, но всё равно спасибо.

Добавлено через 3 минуты
ssXXss, Прямо дебри какие-то... я не так ещё поднатаскался.
Yandex
Объявления
16.05.2013, 05:34     Можно ли записывать объекты класса string в память, чтоб потом их прочитать?
Ответ Создать тему
Опции темы

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