将文件读入矢量(C ++)

时间:2016-03-06 02:46:28

标签: c++

所以我现在是第二年的计算机工程专业的学生,​​我已经遇到了这个我目前正在注册的C ++数据结构类的大墙。我必须创建的这个程序应该从文件中读取数据,输入将数据转换为矢量并显示该文件的最小值和最大值。她还希望我使用模板,但我只是想在我走过这条路之前让这件事情发生。现在我遇到的问题是,除了我的代码中的这一点,我无法做任何事情。

现在这段代码显然是不完整的,但我似乎无法弄清楚如何将这些值读入一个向量,然后抛出作为字符串的值。说实话,我失去了酱油,因为缺乏更好的比喻,把棕色的东西扔在墙上,看看它是否粘在上面。我个别理解这些主题,但是将它们组合在一起并投入数据文件让我迷失了方向。如果有人可以花时间坐下来帮我解决这个问题,因为我的教授一周没有回复我的电子邮件(仅限在线课程),这个项目将于周二到期,我已经在最后2个工作了几天没有完成。

我非常感谢这种帮助,并且理解我即将失去它。我在Java,Diff Eq或HTML / CSS课程中没有任何问题,但是这个C ++课程绝对支配我(在C ++课程的入门中收到了B)。再次感谢,我感谢任何可以提供帮助的人!

//Nicholas Stafford
//COP2535.0M1 
//Read in text file into multiple vectors and display maximum and minimum integers/strings.

#include <iostream> 
#include <string>
#include <vector>
#include <fstream>
#include <algorithm>


using namespace std;



int main() {

    ifstream inputFile; //File input object
    const int fSize = 6;
    int numCt = 0; //Counts number of integers
    vector<int> numInt(fSize);
    string numWd;


    //Open input file
    inputFile.open("minmax.txt");

    //Data validation for file
    if (inputFile)
    {
        //Try method to remove string values
        try
        {
            //Only pull the integer values into a vector
            while (inputFile >> numInt)
            {
                numCt++;
            }
        }
        catch (string noString)
        {
            cout << noString;
        }

    }
}

1 个答案:

答案 0 :(得分:1)

你提到你有Java背景,我很遗憾地告诉你,你正在遭受Java-itis的痛苦:

    try
    {
        //Only pull the integer values into a vector
        while (inputFile >> numInt)
        {
            numCt++;
        }
    }
    catch (string noString)
    {
        cout << noString;
    }

这或多或少会在Java中如何工作:如果发生错误,Java通常会抛出异常。在这里,您试图读取int值,并假设如果读取的下一个项不是整数,则抛出异常。

这就是它在Java中的工作方式,但这不是C ++的工作方式。

如果>>运算符失败,C ++会将输入流设置为错误状态,并在不执行转换的情况下正常返回,使int值保持未初始化状态。 C ++不会抛出异常。通常,C ++代码抛出的异常数量远远少于等效的Java代码。

正如我之前多次说过的那样,我认为C ++中的初学者在输入流上使用>>运算符时,由于没有自己的错误而不公平地经历了很多挫败感。他们的教练教他们一直使用它,但他们真的不应该。这是一本教科书的例子。

您期望>>读取下一行文字。它没有。它从输入流中读取下一个以空格分隔的glob。如果你有

2  3

然后>>运算符只会读取'2'而不是'3'。此外,>>运算符处理换行符就像任何形式的空格一样。而且,正如我所提到的,由于>>处理错误报告的方式,您必须明确检查它。

总之,您应该如何处理C ++中的每一行输入:

std::string line;

std::getline(std::cin, line);

这会读取一行文字。而已。只有在您完成该步骤后,您才可以开始使用>>运算符,找出其中的内容:

std::istringstream parse(line);

parse >> numInt;

if (parse.fail())
{
     // Conversion failed, to what you want with it.
}

干净,简单,解析失败不会影响std::cin输入流的状态,否则您有义务在失败时重置该输入流。