在输出到文件之前从用户输入

C++ Input from user before Output to file

本文关键字:用户 输入 输出 文件      更新时间:2023-10-16

我有这段代码,应该在将随机数写入文件之前从用户获取最小值和最大值,但它写入文件并跳过等待用户输入。如何在写入文件之前等待并获取用户的输入,并使用用户的输入来写入文件。

解决方案:它工作,除了我运行了以下命令:g++ randomNumbers.cpp,并期望程序立即运行,但我忘记通过运行输出文件手动运行它。

#include <iostream>
#include <fstream>
#include <string>
const bool CREATE_FILE = true;
void getMinMax(int&,int&);
void writeFile(std::ofstream&, int&, int&);
int main(){
    if (CREATE_FILE){
        int min;
        int max;
        std::ofstream outfile;
        getMinMax(min, max);
        writeFile(outfile, min, max);
    }
}
void getMinMax(int& min,int& max){
    std::cout << "Enter min: ";
    std::cin >> min;
    std::cout << "Enter max: ";
    std::cin >> max;
}
void writeFile(std::ofstream& file, int& min, int& max){
    file.open("numbers.txt", std::fstream::out);
    for (int i = 1; i <= 10; i++){
        file << min + (rand() % (int)(max - min + 1));
    }
    file.close();
}

我觉得这个程序没有任何问题。它使用Visual Studio 2015 Express完成了预期的工作。我看到的唯一错误是:

file << min + (rand() % (int)(max - min + 1));

这将数字一个接一个地附加到文件中,没有任何分隔空格。对我来说,结果是文本文件包含:

208131917161201920

我将把这一行替换为:

file << min + (rand() % (max - min + 1)) << ' ';

本身,我不明白为什么这段代码不能在你的机器上运行。尝试使用不同的编译器或在你的终端上声明程序的显式结果(例如,是否创建了"numbers.txt",如果是,如果有的话,里面是什么?)。如果这只是一个较大文件的一个段,那么std::cin可能会从输入缓冲区读取剩余的垃圾。在请求用户输入之前,尝试将此添加到getMinMax的主体中:

std::cin.ignore(MAX_INT);
std::cin.clear();

这不是相关的,但在c++中,没有必要在函数结束时手动关闭文件。当std::fstream超出作用域时,它的析构函数将自动关闭文件。此外,如果你的函数不打算改变整型数,可以按值传递而不是按引用传递。从你的代码风格来看,我猜你已经习惯了用C编程,并试图做出改变;它有助于尽早开始编写习惯的c++代码

编辑:尝试重写getMinMax方法为:

#include <sstream>
void getMinMax(int& Min, int& Max)
{
    using namespace std;
    cin.ignore(MAX_INT);
    cin.clear();
    string temp;
    cout << "Enter min: "
    getline(cin, temp);
    stringstream(temp) >> Min;
    cout << "Enter max: "
    getline(cin, temp);
    stringstream(temp) >> Max;
    //printf("(Min, Max) = (%i, %i)n", Min, Max); //For debugging
}

这是你发布的内容的一个冗长但更安全的版本。如果这行不通,那我不知道该怎么跟你说。如果它确实工作,那么我的猜测是输入流被污染了。

我建议如下:

  • 修复缺失的包括:即添加include <stdlib.h>到你的文件。
  • 打开一个终端,导航到你的randomNrs.cpp文件所在的目录(或者你给它起的任何名字)
  • 编译它:你说你正在使用g++,所以你只要在该目录下运行g++ randomNrs.cpp -o randomNrs - -o标志将允许你将二进制文件命名为默认的a.out以外的东西。在本例中,将其命名为randomNrs
  • 运行它:然后通过输入./randomNrs
  • 从该目录中运行可执行文件

这些是我为了运行你的程序所经历的步骤。我用的是RHEL,但我想在OS X上应该是一样的