Подтвердить что ты не робот

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

Я хочу написать переменную 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 *)&studentPassword, sizeof(std::string));
    write.close();`
}
4b9b3361

Ответ 1

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

Если вы хотите записать в текстовый файл, лучший способ сделать это, вероятно, будет с 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 выходит за рамки.

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

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

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

Ответ 2

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

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

Ответ 3

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

Ответ 4

Эта проблема раздражала меня, и xxd не работает для моего варианта использования, потому что он заставил переменную с именем что-то вроде __home_myname_build_prog_cmakelists_src_autogen, когда я попытался ее написать, поэтому я создал утилиту для решения именно этой проблемы:

https://github.com/Exaeta/brcc

Он генерирует исходный файл и файл заголовка и позволяет вам явно установить имя каждой переменной, чтобы затем вы могли использовать их через std :: begin (arrayname) и std :: end (arrayname).

Я включил его в свой проект cmake следующим образом:

add_custom_command(
  OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/binary_resources.hpp ${CMAKE_CURRENT_BINARY_DIR}/binary_resources.cpp
  COMMAND brcc ${CMAKE_CURRENT_BINARY_DIR}/binary_resources RGAME_BINARY_RESOURCES_HH txt_vertex_shader ${CMAKE_CURRENT_BINARY_DIR}/src/vertex_shader1.glsl
  DEPENDS src/vertex_shader1.glsl)

С небольшими изменениями, я полагаю, это можно сделать и для C.