C ++ строка в C char массив для записи в двоичный файл - PullRequest
0 голосов
/ 11 марта 2019

Я пытаюсь написать и прочитать строку в / из двоичного файла, но я не могу понять, почему sizeof (t) возвращает 4.

//write to file
ofstream f1("example.bin", ios::binary | ios::out);
string s = "Valentin";
char* t = new char[s.length()+1];
strcpy(t, s.c_str());
cout << s.length()+1 << " " << sizeof(t) << endl; // prints 9 4
for(int i = 0; i < sizeof(t); i++)
{
    //t[i] += 100;
}
f1.write(t, sizeof(t));
f1.close();

// read from file
ifstream f2("example.bin", ios::binary | ios::in);
while(f2)
{
    int8_t x;
    f2.read((char*)&x, 1);
    //x -= 100;
    cout << x;  //print Valee
}
cout << endl;
f2.close();

Неважно, какой размер я положил вchar * array t, код всегда печатает "4" как его размер.Что я должен сделать, чтобы записать данные длиной более 4 байтов?

Ответы [ 3 ]

3 голосов
/ 11 марта 2019

Вот как сделать написание кода простым способом

//write to file
ofstream f1("example.bin", ios::binary | ios::out);
string s = "Valentin";
f1.write(s.c_str(), s.size() + 1);
f1.close();

РЕДАКТИРОВАТЬ ОП на самом деле хочет что-то вроде этого

#include <algorithm> // for transform

string s = "Valentin";
// copy s to t and add 100 to all bytes in t
string t = s;
transform(t.begin(), t.end(), t.begin(), [](char c) { return c + 100; });
// write to file
ofstream f1("example.bin", ios::binary | ios::out);
f1.write(t.c_str(), t.size() + 1);
f1.close();
2 голосов
/ 11 марта 2019

char *t - это указатель, а не массив, поэтому sizeof вернет размер указателя на вашем компьютере, который, по-видимому, составляет 4 байта.

Правильный способ определения длины строки в стиле C - включить <cstring> и использовать std::strlen.

2 голосов
/ 11 марта 2019

sizeof(char*) печатает размер, используемый указателем на (a) char (s). На вашей платформе 4.

Если вам нужен размер строки, вы должны использовать strlen. Или просто s.length().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...