Jak zapisać std :: string do pliku?

87

Chcę zapisać std::stringzmienną, którą akceptuję od użytkownika do pliku. Próbowałem użyć write()metody i zapisuje do pliku. Ale kiedy otwieram plik, widzę pola zamiast ciągu.

Ciąg jest tylko pojedynczym słowem o zmiennej długości. Czy std::stringnadaje się do tego czy należy użyć tablicę znaków czy coś.

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();`
}
Slashr
źródło
3
Proszę pokazać swój kod. Ogólnie rzecz biorąc, jeśli jest prawidłowo używany, std::stringjest do tego w porządku.
Bezużyteczne
2
Musisz zapisać ZAWARTOŚĆ „ładunku” ciągu, a nie obiekt ciągu jako taki (który zwykle zawiera tylko długość i wskaźnik do rzeczywistej zawartości)
Mats Petersson

Odpowiedzi:

121

Obecnie zapisujesz dane binarne z string-obiektu do swojego pliku. Te dane binarne będą prawdopodobnie składać się tylko ze wskaźnika do rzeczywistych danych i liczby całkowitej reprezentującej długość ciągu.

Jeśli chcesz pisać do pliku tekstowego, najlepszym sposobem na zrobienie tego byłby prawdopodobnie ofstream„strumień wyjściowy”. Zachowuje się dokładnie tak std::cout, jak , ale dane wyjściowe są zapisywane do pliku.

Poniższy przykład odczytuje jeden ciąg ze stdin, a następnie zapisuje ten ciąg w pliku 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;
}

Zauważ, że out.close()nie jest to absolutnie konieczne: dekonstruktor ofstreammoże sobie z tym poradzić, gdy tylko outwyjdzie poza zakres.

Więcej informacji można znaleźć w dokumentacji C ++: http://cplusplus.com/reference/fstream/ofstream/ofstream/

Teraz, jeśli chcesz zapisać do pliku w postaci binarnej, powinieneś to zrobić, używając rzeczywistych danych w ciągu. Najłatwiejszym sposobem uzyskania tych danych byłoby użycie string::c_str(). Możesz więc użyć:

write.write( studentPassword.c_str(), sizeof(char)*studentPassword.size() );
JSQuareD
źródło
3
Musiałem dodać std :: ios :: binary, aby nie mieć problemów ze znakami nowej linii
Waddles
19

Zakładając, że używasz a std::ofstreamdo zapisu do pliku, poniższy fragment kodu zapisze std::stringdo pliku w postaci czytelnej dla człowieka:

std::ofstream file("filename");
std::string my_string = "Hello text in file\n";
file << my_string;
stefan
źródło
0

usuń ios::binaryze swoich trybów w swoim ofstream i użyj studentPassword.c_str()zamiast (char *)&studentPasswordw swoimwrite.write()

Tolini
źródło