что не так с этой программой? - PullRequest
1 голос
/ 30 июня 2011
#include <iostream>
#include <string>
#include <fstream>

using namespace std;

int main() {
    string x;
    getline(cin,x);
    ofstream o("f:/demo.txt");
    o.write( (char*)&x , sizeof(x) );
}

Я получаю неожиданный вывод. Я не получаю то, что пишу в строковой функции.Почему это ?Пожалуйста, объясните.

Например, когда я пишу steve pro, я получаю вывод как 8/ steve pro ÌÌÌÌÌÌ ÌÌÌÌ в файле

Я ожидаю, что вывод будет steve pro

Ответы [ 4 ]

9 голосов
/ 30 июня 2011

Вы относитесь к std::string как к чему-то, что это не так. Это сложный объект, который где-то во внутренних органах хранит символы для вас.

Нет оснований предполагать, что массив символов находится в начале объекта (&x), а sizeof объект не имеет отношения к тому, сколько символов он может содержать / представлять косвенно.

Вы, вероятно, ищете:

o.write(x.c_str(), x.length());

Или просто используйте встроенный отформатированный механизм ввода / вывода:

o << x;
4 голосов
/ 30 июня 2011

У вас неправильная модель sizeof, поэтому позвольте мне попытаться сделать это правильно.

Для любого данного объекта x типа T выражение sizeof(x) являетсяконстанта времени компиляции.C ++ никогда не будет проверять объект x во время выполнения.Компилятор знает, что x имеет тип T, поэтому вы можете представить, что он беззвучно преобразует sizeof(x) в sizeof(T), если хотите.

#include <string>

int main()
{
    std::string a = "hello";
    std::string b = "Stack Overflow is for professional and enthusiast programmers, people who write code because they love it.";
    std::cout << sizeof(a) << std::endl;   // this prints 4 on my system
    std::cout << sizeof(b) << std::endl;   // this also prints 4 on my system
}

Все объекты C ++ одного типа принимаютдо точного объема памяти.Конечно, поскольку строки имеют очень разную длину, они будут внутренне хранить указатель на выделенный в куче блок памяти.Но это не касается sizeof.Это невозможно, потому что, как я уже сказал, sizeof работает во время компиляции.

2 голосов
/ 30 июня 2011

Вы получаете именно то, что пишете: двоичное необработанное значение указателя на символ ...

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

int main()
{
    string x;
    getline(cin,x);
    ofstream o("tester.txt");
    o << x;
    o.close();
}

Если вы настаиваете на прямой записи в буфер, вы можете использовать

o.write(x.c_str(), x.size());

PS Немного внимания к форматированию кода затмевает разум

0 голосов
/ 30 июня 2011

Вы передаете адрес объекта для записи в файл, тогда как исходное содержимое находится где-то еще, на что указывает один из его внутренних указателей.

Попробуйте это:

string x;
getline(cin,x);
ofstream o("D:/tester.txt");
o << x;
// or
// o.write( x.c_str() , x.length());
...