在C ++中使用getline()时,没有从文本文件中获取所有行

时间:2014-10-01 04:17:13

标签: c++ fstream getline sstream

我获得了一个家庭作业,用于生成包含随机数行的txt文件,每行都有一个随机的整数,范围介于最小值和最大值之间。很多兰德()很有趣。

无论如何,这很容易。问题的第二部分是读取第一个文件并创建包含一些统计信息的第二个文件,例如:文件中所有整数的总和,它们的平均值,最小值和最大值以及我的主要问题:总和每行中的所有整数。

我写了以下代码:

#include <iostream>
#include <fstream>
#include <string>
#include <sstream>
#include <cstdlib>
#include <cmath>
using namespace std;

int main()
{
        string newLine;
        stringstream ss;
        int newInput = 0, oldInput = 0;
        int lineSum = 0;
        int lineCounter = 0;
        int allSum = 0;
        int intCounter = 0;
        double averageOfAll = 0;
        int minInt = 0;
        int maxInt = 0;

.... //生成第一个文件。这里没有问题。

ifstream readFile;
readFile.open("inputFile.txt");

ofstream statFile;
statFile.open("stat.txt");

if(readFile.is_open()) {
        while (getline(readFile, newLine)) {    //my problem should be somewhere
                                                //around here...  
                ss.str("");
                ss << newLine;
                while(!ss.eof()) {
                        oldInput = newInput;
                        ss >> newInput;

                        cout << newInput << endl;
                        lineSum += newInput;
                        allSum += newInput;
                        intCounter++;
                        minInt = min(oldInput, newInput);
                        maxInt = max(oldInput, newInput);
                }

                lineCounter++;
                statFile << "The sum of all integers in line " << lineCounter
                << " is: " << lineSum << endl;
                lineSum = 0;
        }

        readFile.close();

        averageOfAll = static_cast<double>(allSum)/intCounter;

        statFile << endl << endl << "The sum of all integers in the whole file: "
        << allSum;
        statFile << endl << "The average of value of the whole stream of numbers: "
        << averageOfAll;
        statFile << endl << "The minimum integer in the input file: "
        << minInt;
        statFile << endl << "The maximum integer in the input file: "
        << maxInt;
        statFile << endl << endl << "End of file\n";

} else
        cout << endl << "ERROR: Unable to open file.\n";

statFile.close();

return 0;
}

运行程序时,似乎我的循环会迭代文件中的所有行。但是,它们只收集第一行的整数,其余的则保持为0。

我会发布我的输出的截图,但我没有足够的代表:( 任何人都可以帮忙吗?


有效!

inputFile.txt ^ inputFile.txt

statFile.txt

statFile.txt(我的输出)^

就像P0W和James Kanze所说的那样,这是一个旗帜问题,并且误用了我的串流。我更正了我的代码如下:

.
.
.
 while (getline(readFile, newLine)) {
                    stringstream ss(newLine);

                    while(ss >> newInput) {

                            lineSum += newInput;
                            allSum += newInput;
                            intCounter++;
                            minInt = min(minInt, newInput);
                            maxInt = max(maxInt, newInput);
                    }
.
.
.

谢谢大家!

2 个答案:

答案 0 :(得分:1)

您可以尝试关注内部循环

ss << newLine;

while( ss >> newInput ) 
{
  //.... Your logic,
 // might need little update

  oldInput = newInput;
}

ss.clear( ); // clear the flags !

答案 1 :(得分:1)

有几个问题,但主要的问题是你正在尝试 重用ss(这应该是一个 std::istringstream)。它可以这样做,但它是公平的 很难做对,因为溪流拥有很多状态 需要重新初始化。 (在这种情况下,流会记住它 它已经看到文件结束,并且在此之前不做任何其他事情 已重置。)你的循环应如下所示:

while ( getline( readFile, newLine ) ) {
    std::istringstream ss( newLine );
    //  ...
}

一旦你得到了std::istringstream,你就不想了 循环直到eof(在最后一个之后可能设置也可能不设置) 成功输入);你想循环直到输入失败。 ( 输入失败后,您可能需要检查eof:是否 未设置,输入因格式错误而失败 线;例如有人输入"abc"而不是整数。)