Як написати std :: рядок у файл?


86

Я хочу записати 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();`
}

3
Будь ласка, покажіть свій код. Загалом, якщо правильно використовувати, std::stringце добре.
марний

2
Вам потрібно зберегти ЗМІСТ „корисного навантаження” рядка, а не об’єкт рядка як такий (який зазвичай містить лише довжину та вказівник на фактичний вміст)
Матс Пітерссон,

Відповіді:


120

На даний момент ви записуєте двійкові дані у 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вийде з області дії.

Для отримання додаткової інформації див. Посилання на C ++: http://cplusplus.com/reference/fstream/ofstream/ofstream/

Тепер, якщо вам потрібно записати у файл у двійковій формі, ви повинні зробити це, використовуючи фактичні дані у рядку. Найпростіший спосіб отримати ці дані - використовувати string::c_str(). Отже, ви можете використовувати:

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

3
Мені довелося додати std :: ios :: binary, щоб це не мало проблем із символами нового рядка
Waddles

19

Якщо припустити, що ви використовуєте a std::ofstreamдля запису у файл, наступний фрагмент запише a std::stringу файл у зручній для читання формі:

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

0

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.