Как записать std::string в файл?

#c #binaryfiles

#c

Вопрос:

Я хочу записать std::string переменную, которую я принимаю от пользователя, в файл. Я попытался использовать write() метод, и он записывает данные в файл. Но когда я открываю файл, я вижу поля вместо строки.

Строка представляет собой всего лишь одно слово переменной длины. std::string Подходит для этого или я должен использовать массив символов или что-то в этом роде.

 ofstream write;
std::string studentName, roll, studentPassword, filename;


public:

void studentRegister()
{
    cout<<"Enter roll number"<<endl;
    cin>>roll;
    cout<<"Enter your name"<<endl;
    cin>>studentName;
    cout<<"Enter password"<<endl;
    cin>>studentPassword;


    filename = roll   ".txt";
    write.open(filename.c_str(), ios::out | ios::binary);

    write.put(ch);
    write.seekp(3, ios::beg);

    write.write((char *)amp;studentPassword, sizeof(std::string));
    write.close();`
}
 

Комментарии:

1. Пожалуйста, покажите свой код. В общем, при правильном использовании, std::string вполне подходит для этого.

2. Вам нужно сохранить СОДЕРЖИМОЕ «полезной нагрузки» строки, а не строковый объект как таковой (который обычно содержит только длину и указатель на фактическое содержимое)

Ответ №1:

В данный момент вы записываете двоичные данные из string -object в свой файл. Эти двоичные данные, вероятно, будут состоять только из указателя на фактические данные и целого числа, представляющего длину строки.

Если вы хотите выполнить запись в текстовый файл, лучшим способом сделать это, вероятно ofstream , будет использование «out-file-stream». Он ведет себя точно так std::cout же, но выходные данные записываются в файл.

Следующий пример считывает одну строку из stdin, а затем записывает эту строку в файл output.txt .

 #include <fstream>
#include <string>
#include <iostream>

int main()
{
    std::string input;
    std::cin >> input;
    std::ofstream out("output.txt");
    out << input;
    out.close();
    return 0;
}
 

Обратите внимание, что out.close() здесь это не обязательно: деконструктор ofstream может справиться с этим для нас, как только out выйдет за рамки.

Для получения дополнительной информации см. C -reference: http://cplusplus.com/reference/fstream/ofstream/ofstream /

Теперь, если вам нужно записать в файл в двоичном виде, вы должны сделать это, используя фактические данные в строке. Самым простым способом получения этих данных было бы использование string::c_str() . Так что вы могли бы использовать:

 write.write( studentPassword.c_str(), sizeof(char)*studentPassword.size() );
 

Комментарии:

1. Мне пришлось добавить std::ios::binary, чтобы у этого не было проблем с символами новой строки

2. out.close() ? дважды? плохой ответ

3. @caoanan это для демонстрации API. Я также упоминаю в тексте тела, что это происходит автоматически, когда переменная выходит за пределы области видимости. Во всяком случае, close() он идемпотентен, так что нет ничего плохого в том, что он вызывается несколько раз.

Ответ №2:

Предполагая, что вы используете a std::ofstream для записи в файл, следующий фрагмент будет записывать a std::string в файл в удобочитаемой форме:

 std::ofstream file("filename");
std::string my_string = "Hello text in filen";
file << my_string;
 

Ответ №3:

удалите ios::binary из ваших режимов в вашем ofstream и используйте studentPassword.c_str() вместо (char *)amp;studentPassword в вашем write.write()