C++ 字符串到/从文件

Posted

技术标签:

【中文标题】C++ 字符串到/从文件【英文标题】:C++ strings to/from file 【发布时间】:2012-02-08 17:46:54 【问题描述】:

简单的问题:为什么下面的代码不起作用?我希望保存和读取一个字符串,但这不会发生......

#include <iostream>
#include <fstream>
using namespace std;

static string path = "/Users/john/Desktop/file";


main() 
string a;

a = "one\n";

fstream outStream(path.c_str(), ios::out | ios::binary);
outStream.write((char *) &a, sizeof(a));
outStream.close();

a = "two\n";

fstream inStream(path.c_str(), ios::in | ios::binary);
inStream.read((char *) &a, sizeof(a));
inStream.close();

cout << a;
return 0;

非常感谢!

【问题讨论】:

会发生什么?错误信息?警告?链接器错误?电脑重启了吗? 当你开始转换 (char *) 时,你基本上是在告诉编译器关闭而不是修复它告诉你的错误。 从不告诉编译器闭嘴。正确修复错误。对于初学者来说,这意味着不要在没有询问的情况下使用演员表 【参考方案1】:

你不能写一个字符串作为指针。要么使用普通的流操作符 (&lt;&lt;) 要么使用

outStream.write(a.c_str(), a.size());

【讨论】:

技术上正确。但是您认为这是初学者(如 OP)学习将字符串写入流的最佳方式吗?我不认为这会引导他们走错路。【参考方案2】:

write 中也使用.c_str().size()

outStream.write(a.c_str(),a.size()); 

.length() 也在那里,它返回与.size() 相同的值。

但你为什么不干脆这样做:

outStream << a;

并将其读作:

inStream >> a;

【讨论】:

谢谢!我发现即使在 outStream.read 中我也必须使用这个技巧,否则我会遇到分段错误。我不能使用 > 因为我的文件不只包含一个字符串......:D 由于 OP 显然是一个菜鸟,你应该添加一个关于用 【参考方案3】:
(char *) &a

不是存储在std::string 中的字符串,您只是告诉编译器将该任意地址(存储std::string path 对象的位置)视为字符。

sizeof(a)

不会以字节为单位给出字符串的长度:sizeof 给出对象的大小,但std:string 对象是您的角色的管理信息,而不是文本本身。

使用

outStream.write(a.c_str(), a.size());

或者,更好,

outStream << a;

【讨论】:

【参考方案4】:

您已经声明了一个string,但您正试图将它当作一个字符数组来读写。 std::string 未实现为字符数组。

【讨论】:

【参考方案5】:

使用

outStream << a.c_str();

而不是

outStream.write((char *) &a, sizeof(a));

【讨论】:

【参考方案6】:

改变

outStream.write((char *) &a, sizeof(a));

outStream.write(a.c_str(), s.size());

【讨论】:

以上是关于C++ 字符串到/从文件的主要内容,如果未能解决你的问题,请参考以下文章

将字符串从 C# 发送到 C++ dll 文件

C++字符串数组,从文件中加载文本行

c++文件怎么从文件中读出和写入字符串?

如何有效地将大字符串从 Python 传递到 C++ 扩展方法?

如何使用 C++ 在 Winsock 中将大字符串从客户端发送到服务器

从文本文件中读取整数并使用 C++ 将它们存储到向量中