【问题标题】:leading 0's are not getting read from file [duplicate]没有从文件中读取前导 0 [重复]
【发布时间】:2017-07-25 18:23:31
【问题描述】:

我正在逐字符读取文件的内容:

文件有:

000001111100000

当我使用这段代码阅读时

int content;// converting to char will result in proper output.
std::ifstream fin;
fin.open("zero_one");
fin>>content;
while (!fin.eof())
{
    std::cout<<content;
    fin>>content;
}
fin.close();

我得到的输出为:1111100000(前导零不存在)但尾随零存在。

问题是:当我使用&gt;&gt; 运算符读取时,为什么我在输出中没有得到前导零,而在输出中得到尾随零。

另外,如果我将 int 转换为 charcontent 变量,则输出与文件的内容相同。为什么会这样?据我所知,charint 之间的唯一区别是变量的字节大小。

【问题讨论】:

  • int 只存储数字的值。 0000011111000001111100000 具有相同的值。如果实际的字符表示对您的用例很重要,则需要将数字作为字符串读取。
  • "据我所知,char 和 int 之间的唯一区别是变量的字节大小。"对于 int 和 char 类型确实如此,但是对于这些类型,>> 输入运算符的重载方式不同。
  • user fluent in C++ 不需要发布此内容。
  • 不,它不依赖于实现。标准(从 C++03 到 C++17 后草案的所有版本)要求初始标志为 skipws | dec。最后发现它记录在std::basic_ios::init(),在Postconditions下。
  • 你已经避免了while (!fin.eof()) 最隐蔽的影响,但是你已经让自己在无效输入上陷入无限循环,因为你只检查文件结尾,如果它程序可能永远无法到达发现不好的价值。推荐while (fin&gt;&gt;content)作为替代品。

标签: c++ file-handling


【解决方案1】:

如果contentint,它会将数据读取为单个 整数:你会得到一个值为1111100000 的int。如果contentchar,它分别读取每个字符。

如果在while 循环中,您说std::cout&lt;&lt;content&lt;&lt;'\n'; 而不仅仅是std::cout&lt;&lt;content;,您会看到差异。那么如果contentint,您将看到一行包含1111100000,但如果是char,您将看到15 行,每个输入字符一行。

如果您在输入文件的每个字符之间放置空格,它们将被读取为单独的ints,结果将相同,但仍有一个重要区别:chars 的值不是char(0)char(1),而是'0''1'(分别为0x300x31),对应数字的ASCII 值。另一方面,ints 实际上是 01

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-22
    • 1970-01-01
    • 2018-05-14
    • 2012-10-12
    相关资源
    最近更新 更多