C ++ строки в / из файла - PullRequest
       1

C ++ строки в / из файла

1 голос
/ 08 февраля 2012

Простой вопрос: почему следующий код не работает? Я ожидаю, что строка будет сохранена и прочитана, но этого просто не происходит ...

#include <iostream>
#include <fstream>
using namespace std;

static string path = "/Users/john/Desktop/file";


main() {
string a;

a = "one\n";

fstream outStream(path.c_str(), ios::out | ios::binary);
outStream.write((char *) &a, sizeof(a));
outStream.close();

a = "two\n";

fstream inStream(path.c_str(), ios::in | ios::binary);
inStream.read((char *) &a, sizeof(a));
inStream.close();

cout << a;
return 0;}

Большое спасибо!

Ответы [ 6 ]

6 голосов
/ 08 февраля 2012

Вы не можете написать строку в качестве указателя. Либо используйте обычные операторы потока (<<), либо используйте

outStream.write(a.c_str(), a.size());
2 голосов
/ 08 февраля 2012
(char *) &a

- это не строка символов, хранящаяся внутри std::string, вы просто указываете компилятору обрабатывать этот произвольный адрес (где хранится объект std::string path), как если бы это были символы.

sizeof(a)

не даст длину строки в байтах: sizeof дает размер объектов, но объект std:string - это служебная информация для ваших персонажей, а не сам текст.

Использование

outStream.write(a.c_str(), a.size());

или, что лучше,

outStream << a;
2 голосов
/ 08 февраля 2012

Используйте .c_str() и .size() в write, а также:

outStream.write(a.c_str(),a.size()); 

.length() также там, который возвращает то же значение, что и .size().

Но почему бы вам просто не сделать это:

outStream << a;

И читать это как:

inStream >> a;
1 голос
/ 08 февраля 2012

Изменение

outStream.write((char *) &a, sizeof(a));

Для

outStream.write(a.c_str(), s.size());
1 голос
/ 08 февраля 2012

использование

outStream << a.c_str();

вместо

outStream.write((char *) &a, sizeof(a));
1 голос
/ 08 февраля 2012

Вы объявили aa string, но вы пытаетесь прочитать и записать его, как если бы это был массив символов.std::string не реализован как массив символов.

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