#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()