Làm thế nào để ghi std :: string vào tệp?


87

Tôi muốn ghi một std::stringbiến mà tôi đang chấp nhận từ người dùng vào một tệp. Tôi đã thử sử dụng write()phương pháp này và nó ghi vào tệp. Nhưng khi tôi mở tệp, tôi thấy các hộp thay vì chuỗi.

Chuỗi chỉ là một từ đơn có độ dài thay đổi. Có std::stringphù hợp cho điều này hay tôi nên sử dụng một mảng ký tự hoặc một cái gì đó.

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
Vui lòng hiển thị mã của bạn. Nói chung, nếu được sử dụng đúng cách, std::stringthì tốt cho điều này.
Vô dụng

2
Bạn cần phải lưu 'tải' NỘI DUNG của chuỗi, không phải là đối tượng chuỗi như vậy (mà thường chỉ chứa một dài và một con trỏ đến nội dung thực tế)
Thảm Petersson

Câu trả lời:


122

Bạn hiện đang ghi dữ liệu nhị phân trong string-đối tượng vào tệp của bạn. Dữ liệu nhị phân này có thể sẽ chỉ bao gồm một con trỏ đến dữ liệu thực và một số nguyên đại diện cho độ dài của chuỗi.

Nếu bạn muốn ghi vào một tệp văn bản, cách tốt nhất để thực hiện điều này có lẽ là với ofstreammột "dòng ngoài tệp". Nó hoạt động giống hệt như std::cout, nhưng đầu ra được ghi vào một tệp.

Ví dụ sau đây đọc một chuỗi từ stdin, sau đó ghi chuỗi này vào tệp 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;
}

Lưu ý rằng điều đó out.close()không hoàn toàn cần thiết ở đây: bộ giải mã của ofstreamcó thể xử lý điều này cho chúng tôi ngay khi outvượt ra khỏi phạm vi.

Để biết thêm thông tin, hãy xem C ++ - tham khảo: http://cplusplus.com/reference/fstream/ofstream/ofstream/

Bây giờ nếu bạn cần ghi vào tệp ở dạng nhị phân, bạn nên thực hiện việc này bằng cách sử dụng dữ liệu thực tế trong chuỗi. Cách dễ nhất để lấy dữ liệu này là sử dụng string::c_str(). Vì vậy, bạn có thể sử dụng:

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

3
Tôi đã phải thêm std :: ios :: binary để điều này không gặp vấn đề với các ký tự dòng mới
Waddles 31/10/16

19

Giả sử bạn đang sử dụng std::ofstreamđể ghi vào tệp, đoạn mã sau sẽ ghi std::stringvào tệp ở dạng con người có thể đọc được:

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

0

xóa ios::binarykhỏi các chế độ trong luồng của bạn và sử dụng studentPassword.c_str()thay vì (char *)&studentPasswordtrongwrite.write()

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.