C ++流无法分辨一个字符串的结束和下一个字符串的开始?

时间:2016-11-21 05:06:43

标签: c++ stream ifstream ofstream

我正在写一个字符串和一个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分开,而不是将它们组合成单个字符串?

1 个答案:

答案 0 :(得分:0)

您只需添加换行符即可分隔字符串

outStream << outStr1 << std::endl << outInt1 << std::endl << outStr2;
  

但为什么需要换行?字符串以null结尾,所以   不应该c ++将那个空字符写入字节流吗?如果是这样,   那为什么需要换行?

虽然换行适合你,但它不一定是新行...

std :: string不一定必须以nul终止。它有size,应该被视为数组/字符向量。如果str构造为:

,则可以将nul写入流中
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是一个好的开始。