如何将std :: string写入文件?

时间:2013-03-13 14:25:20

标签: 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 *)&studentPassword, sizeof(std::string));
    write.close();`
}

4 个答案:

答案 0 :(得分:82)

您目前正在将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() );

答案 1 :(得分:11)

假设您使用std::ofstream写入文件,以下代码段会以人类可读的形式将std::string写入文件:

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

答案 2 :(得分:0)

从您的游戏模式中移除ios::binary,并在studentPassword.c_str()

中使用(char *)&studentPassword代替write.write()

答案 3 :(得分:0)

这个问题让我很烦,并且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。