【问题标题】:File Read in C++ Unexpected output在 C++ 中读取文件意外输出
【发布时间】:2014-01-11 19:19:04
【问题描述】:

这是代码:

#include<iostream>
#include<fstream>
#include<cstdlib>
#include<string>

using namespace std;

int grade; //declared globally because visual 2013 gives error if locally

int main() {

    ofstream outFile("C:\\Users\\Affan_000\\Desktop\\FileWrite.txt",ios::out);
    while (grade != -1){
        outFile << grade<<endl;
        cin >> grade;
    }
    outFile.close();

    return 0;
}

输入成绩后

80 50 60 40 90

当我打开文本文件时,零在顶部:

0 80 50 60 40 90

我也在 Dev-C++ 中尝试过。

【问题讨论】:

  • 您在执行提取之前打印grade
  • 另外,当你在本地声明grade 时,编译器给你的错误是什么?
  • @0x499602D2 我猜至少会警告从未初始化的变量中读取。显而易见的解决方案是对其进行初始化,而不是使其成为全局对象。
  • 错误 1 ​​错误 C4700:使用了未初始化的局部变量“等级”
  • @user3150227 好吧...因为您没有初始化局部变量。这很糟糕——你怎么期望它在没有初始化的情况下包含任何有意义的东西?

标签: c++ iostream


【解决方案1】:

除了第一次写入,然后才读取应该写入的内容,您的代码不会检查输入是否成功:您应该始终在阅读后检查读取是否成功

while (std::cin >> grade && grade != -1) {
    std::cout << grade << '\n';
}

【讨论】:

    【解决方案2】:

    这并不奇怪,因为在 while 循环中,您在将用户输入输入之前打印grade。将cin &gt;&gt; grade; 语句移到之前 outFile &lt;&lt; grade &lt;&lt; endl; 就可以了。

    但是,现在您需要检查它是否确实不同于 -1,因此您的最终循环如下所示:

    while (1) {
        cin >> grade;
    
        if (grade != -1)
            outFile << grade << endl;
        else
            break;
    }
    

    【讨论】:

      【解决方案3】:

      0 被输入,因为你已经写了声明 outFile &lt;&lt; grade&lt;&lt;endl; 在输入等级全局变量之前 所以在第一次迭代中插入 0,因为全局变量的默认值是 0 如果你不初始化它们。所以在写outFile &lt;&lt; grade&lt;&lt;endl;之前写cin&gt;&gt;grade;

      【讨论】:

        【解决方案4】:

        只需交换行 cin 和 cout。干杯

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-08-26
          • 2012-04-01
          • 2012-05-25
          • 1970-01-01
          • 2010-10-03
          • 1970-01-01
          • 2018-03-05
          • 1970-01-01
          相关资源
          最近更新 更多