2 / 2 / 2
Регистрация: 27.07.2012
Сообщений: 40
1

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

15.05.2013, 01:16. Показов 1249. Ответов 19
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Создал класс, который содержит много объектов класса string, но что то не так как надо. В debug режиме удаётся прочитать и вывести, но компилятор после этого выдаёт что-то нехорошее. В режиме release даже не выводит на экран строки. Можно ли вообще объекты класса string просто записать как outfile.write(reinterpret_cast<char*>(&dummyobj), sizeof(dummyobj)), а потом прочитать как infile.read(reinterpret_cast<char*>(&dummyobj), sizeof(dummyobj))?

Добавлено через 13 минут
Компилятор совсем странно себя ведёт. Сейчас в release всё нормально, а вот debug застревает. Я пытаюсь прочитать данные после записи, в новой программе.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.05.2013, 01:16
Ответы с готовыми решениями:

Можно ли динамически выделить память под массив указателей, на объекты класса?
Прошу прощения если не правильно назвал вопрос. Не знаю как правильно сформулировать. Можно ли...

Можно ли записывать объекты в массивы
Подскажите пожалуйста, как сделать массив кубиков?

Разработка класса String, на основании которого можно создавать объекты типа "строка символов"
Дали задание сделать класс строка. Класс должен давать возможность создавать программы, в которых...

Создавать объекты класса динамически а потом перебирать их по очереди
Скачал книгу Лаптева С++ ООП, искомого результата не нашол. У меня есть класс который описывает...

19
What a waste!
1607 / 1299 / 180
Регистрация: 21.04.2012
Сообщений: 2,727
15.05.2013, 01:25 2
Цитата Сообщение от Асурус Посмотреть сообщение
Можно ли вообще объекты класса string просто записать как outfile.write(reinterpret_cast<char*>(&dummyobj), sizeof(dummyobj)), а потом прочитать как infile.read(reinterpret_cast<char*>(&dummyobj), sizeof(dummyobj))?
Нет, нельзя, записывай каждую строку отдельно.
1
503 / 352 / 94
Регистрация: 22.03.2011
Сообщений: 1,112
15.05.2013, 01:28 3
C++
1
str.size() * sizeof(std::string::value_type); //str.size() * sizeof(char)
0
2 / 2 / 2
Регистрация: 27.07.2012
Сообщений: 40
15.05.2013, 01:31  [ТС] 4
Во втором ответе почти ничего не понял, но спасибо за труды.
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
15.05.2013, 12:27 5
stima, sizeof(char) равен 1 по определению.
0
503 / 352 / 94
Регистрация: 22.03.2011
Сообщений: 1,112
15.05.2013, 13:26 6
2Tulosba И?)) Есть такое понятие лучше явное чем не явное.
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
15.05.2013, 13:43 7
stima, явное умножение на 1 лучше, чем отсутствие этого умножения?
0
503 / 352 / 94
Регистрация: 22.03.2011
Сообщений: 1,112
15.05.2013, 13:57 8
умножение на sizeof(char) лучше чем без, а вдург завтра выйдет стандарт говорящий что char может быть от 1 до 3?)
0
Croessmah
15.05.2013, 13:59
  #9

Не по теме:

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

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

0
Tulosba
15.05.2013, 14:07
  #10

Не по теме:

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

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

Добавлено через 51 секунду
Я имею ввиду, чтобы потом, при новом запуске программы считать его без проблем?
0
503 / 352 / 94
Регистрация: 22.03.2011
Сообщений: 1,112
15.05.2013, 23:40 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;
}
0
2 / 2 / 2
Регистрация: 27.07.2012
Сообщений: 40
15.05.2013, 23:56  [ТС] 13
Да, это всё понятно, но только ничего не работает, если например взять другой объект класса string, не тот, который использовали для записи. Так же будет, если запустить программу и не записывая, считать данные. У меня никак не получалось прочитать информацию, работало только до первых трёх символов, я и обычно использую не текстовое сохронение, а бинарное.
0
503 / 352 / 94
Регистрация: 22.03.2011
Сообщений: 1,112
16.05.2013, 00:14 14
Я не телепат код в студию
0
2 / 2 / 2
Регистрация: 27.07.2012
Сообщений: 40
16.05.2013, 01:06  [ТС] 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;
}
0
503 / 352 / 94
Регистрация: 22.03.2011
Сообщений: 1,112
16.05.2013, 01:10 16
Вы издеваетесь? Вы привели мне мой же код?

Цитата Сообщение от Асурус Посмотреть сообщение
У меня никак не получалось прочитать информацию, работало только до первых трёх символов, я и обычно использую не текстовое сохронение, а бинарное.
Где это?
0
2 / 2 / 2
Регистрация: 27.07.2012
Сообщений: 40
16.05.2013, 02:05  [ТС] 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(), всё равно не получается.
0
503 / 352 / 94
Регистрация: 22.03.2011
Сообщений: 1,112
16.05.2013, 02:22 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;
}
1
267 / 189 / 33
Регистрация: 15.01.2011
Сообщений: 681
16.05.2013, 02:51 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
0
2 / 2 / 2
Регистрация: 27.07.2012
Сообщений: 40
16.05.2013, 05:34  [ТС] 20
stima, Спасибо за детальное объяснение, я конечно не всё понял, но всё равно спасибо.

Добавлено через 3 минуты
ssXXss, Прямо дебри какие-то... я не так ещё поднатаскался.
0
16.05.2013, 05:34
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.05.2013, 05:34
Помогаю со студенческими работами здесь

Можно ли объявлять в описании одного класса объекты другого класса
Здравствуйте! Помогите, пожалуйста, разобраться: я описал класс SignalZakon, а теперь хочу создать...

Преобразования строк в объекты класса string
#include &lt;iostream&gt; #include &lt;string.h&gt; class String { private: enum { SZ = 80 }; char...

Можно ли скинуть пароль от biosa на флеш чтоб потом его востонавливать?
:wall::wall::wall::wall::wall::wall:

Где размещать объявления класса, чтобы объекты этого класса можно объявлять в нескольких Form
Вопрос тупой. Так получилось, что надо написать прогу в Visual C# вместо билдера. Где размещать...

Правильно зашифровать строку чтоб потом можно было ее сверить с шифрованной строкой из БД
Здравствуйте. Вот моя проблема: После регистрации на сайте (посредством Membership) данные...

Аннотация @EmbeddableId не воспринимает объекты класса String (Hibernate)
Здравствуйте. При попытке передачи объекта класса Address (String) в качестве @EmbeddableId...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru