【问题标题】:Strange file output C++奇怪的文件输出 C++
【发布时间】:2023-07-12 20:07:01
【问题描述】:

我想打印数字并在它们之间放置一个空格,但在编译之后我注意到我将 + 运算符留在了那里(C# 练习)。当我运行这个程序时,它立即停止工作,但文本文件中有一个非常奇怪的输出。为什么文本文件是这样的?

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

    int main()
    {
        int i=0;
        ofstream f("out.txt");
        while(i != -1)
        {
            f << " " + i++;
        }
        return 0;
    }

551Kb 文件中的一些行:

deleted virtual method called
eleted virtual method called
leted virtual method called
eted virtual method called
ted virtual method called
ed virtual method called
d virtual method called
 virtual method called
virtual method called
irtual method called
rtual method called
tual method called
ual method called
al method called
l method called
 method called
method called
ethod called
thod called
hod called
od called
d called
 called
called
alled
lled
led
ed
d

【问题讨论】:

    标签: c++ file output ofstream


    【解决方案1】:

    当您将整数添加到字符串文字时,它会执行指针运算。所以" " + i++ 获取字符串文字的地址,将i 添加到它,并增加i。然后它将加法的结果传递给&lt;&lt;,因此该地址处的任何 C 样式字符串都会打印到文件中。

    由于您在字符串文字的内存范围之外访问,这会导致未定义的行为。所以它正在将垃圾写入文件。看起来您的字符串文字后的内存包含来自运行时库的内部错误消息,并且您正在打印该字符串。由于i 每次都会递增,因此每次迭代都会在消息的后面开始一个字符。

    您实际上还有一个无限循环,因为递增 i 不会导致 -1 溢出并回绕。

    【讨论】:

    • 整数溢出会导致未定义的行为,因此它可能永远不会导致 -1。例如,编译器可以优化该测试。
    最近更新 更多