我正在写一个字符串和一个int到一个ofstream,然后尝试用ifstream读回来。我希望字符串以空值终止,因此流应该知道字符串停止的位置和int开始的位置。但这并没有发生 - 当我重读它时,它将int视为字符串的一部分。我该如何避免?
#include <fstream>
#include <string>
int main()
{
std::string tempFile("tempfile.out");
std::ofstream outStream(tempFile); //Tried this both with text
//and with ::bin but get same results
std::string outStr1("Hello");
int outInt1 = 5;
std::string outStr2("Goodbye");
outStream << outStr1 << outInt1 << outStr2;
outStream.close();
std::ifstream inStream(tempFile); //Tried this both with text
//and with ::bin but get same results
std::string inStr1, inStr2;
int inInt1;
inStream >> inStr1; //this reads a string that concats all
//my prev values together!
inStream >> inInt1; //doesn't do what I want since the int was
//already read as part of the string
inStream >> inStr2; //doesn't do what I want
}
如何将字符串与int分开,而不是将它们组合成单个字符串?
答案 0 :(得分:0)
您只需添加换行符即可分隔字符串
outStream << outStr1 << std::endl << outInt1 << std::endl << outStr2;
但为什么需要换行?字符串以null结尾,所以 不应该c ++将那个空字符写入字节流吗?如果是这样, 那为什么需要换行?
虽然换行适合你,但它不一定是新行...
std :: string不一定必须以nul终止。它有size
,应该被视为数组/字符向量。如果str构造为:
std::string outStr1{'H', 'e', 'l', 'l', 'o', 0};
,而
std::string s("OK");
构造一个大小为2的字符串。
当您从流中读取数据时,它需要知道规则以提取字节并转换为预期的类型。基本上,如果您从流中读取字符串,则需要知道何时结束字符串。简单的规则是,如果它到达空格(std::isspace()
),则字符串终止。这里的空间意味着空格,制表符,换行符等。
假设您要提取一个整数,它应该在到达整数表示法中不合法的字符时停止,例如&#39; z&#39;。
要完全理解这一点,http://en.cppreference.com/w/cpp/concept/FormattedInputFunction是一个好的开始。