使用cin cout显示垃圾值的文件对象?

时间:2018-08-24 07:14:29

标签: c++ file cin cout turbo-c++

#include<iostream.h>
#include<conio.h>
#include<fstream.h>

void main()
{
    int i, j, k;

    clrscr();

    ofstream out("INT.TST");
    ifstream in("INT.TST");

    out << 25 << ' ' << 4567 << ' ' << 8910;

    in >> i >> j >> k;
    cout << i << ' ' << j << ' ' << k;
    getch();
}

该程序的输出应为:

25 567 8910

但是显示在这里:

8370 0 1530

为什么显示垃圾值?

2 个答案:

答案 0 :(得分:0)

您的代码可能会阻塞在最近的(不错的)编译器上,因为您要打开同一文件两次,一次要读取,一次要写入。在Windows上通常不允许这样做,除非您将特殊值传递给基础WinAPI调用。由于Turbo-C ++已被弃用了数十年,因此我不确定在无法打开文件或只是为您提供封闭流时,它是否会引发异常。因此,您应该始终控制输入功能!

或多或少的代码固定版本可以是:

#include<iostream.h>
#include<conio.h>           // avoid if you can: non portable
#include<fstream.h>

int main()                  // NEVER use void main!
{
    int i, j, k;

    clrscr();               // avoid if you can: non portable

    ofstream out("INT.TST");
    out << 25 << ' ' << 4567 << ' ' << 8910;
    out.close()             // Ok, file is now closed

    ifstream in("INT.TST");
    in >> i >> j >> k;

    if (! in) {
        cerr << "Error reading file\n";
    }
    else {
        cout << i << ' ' << j << ' ' << k;
    }
    getch();              // avoid if you can: non portable
    return 0;             // not strictly necessary but IMHO cleaner
}

答案 1 :(得分:0)

我在gcc和msvc中测试了与您相似的代码,它在Ubuntu或Windows中按预期工作。我相信您没有创建或打开文件的权限(例如ideone.com之类的在线编译器)。由于您尚未检查文件是否已打开(使用is_open()),因此您可能正在使用关闭的文件,并且结果无法预测。请参阅以下代码:

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

int main()
{
    int i, j, k;

    ofstream out("INT.TST");
    ifstream in("INT.TST");

    out << 25 << ' ' << 4567 << ' ' << 8910;

    out.flush();

    if (!in.is_open())
    {
        std::cout << "Error opening file";
    }
    else
    {
        in >> i >> j >> k;
        cout << i << ' ' << j << ' ' << k;
    }

    return 0;
}

它在ideone中写了Error opening file,但可以在Ubuntu和Windows上正常工作。