从输入文件到数组的杂乱读取

时间:2013-12-13 21:21:07

标签: c++ arrays ifstream cin

我已经工作了很长时间,所以我觉得是时候提问了,因为我不知道发生了什么。无论出于何种原因,这个循环只能在第一次正常工作,然后返回到文件的开头并再次从头开始读取。谢谢。

void readGasFile(int numTherms, int arrSize, string fileName, Customer cArray[])
 {
    cout << "reading gas file";

    int i;
    string temp;
    int temp2;

    ifstream inputFile;
    inputFile.open(fileName.c_str());

    if (inputFile.is_open())
    {
        cout << "reading input file";

        string dummyLine;
        getline(inputFile, dummyLine);

        //ignore first line

        /* *****************************************
        format:
        1212 <--- account number
        Lance, Ahmed
        1200  1212  <----- previous, current therms meter readings
        2323        <----- gas therms used
        ******************************************/

        for(i=0; i<arrSize; ++i)
        {
            cout << "start loop" << i << endl;

            inputFile >> temp2;
            cArray[i].setNumber(temp2);

            cout << temp2 << endl;;

            inputFile >> temp;
            cArray[i].setLastName(temp);

            inputFile >> temp;
            cArray[i].setFirstName(temp);

            inputFile >> temp2;
            cArray[i].setPrevious(temp2);

            inputFile >> temp2;
            cArray[i].setCurrent(temp2);

            inputFile >> temp2;
            cArray[i].setTherms(temp2);
        }
    }
    return;
}

1 个答案:

答案 0 :(得分:1)

基于代码并且没有看到确切的输入,这是不可能的,但我敢打赌,阅读实际上失败了。由于您没有像往常一样检查输入,因此您的程序不会注意到它。作为侧节点,您可以读取包含逗号的名称,这可能也是不可取的。以下是我编写循环的方法:

for(i = 0; i != arrSize
           && inFile >> number
           && std::getline(inFile, lastName, ',')
           && std::getline(inFile, firstName)
           && inFile >> previous
           && inFile >> current
           && inFile >> therms; ++i) {
    // set the various values
}

显然,需要适当地声明各种变量。实际上,我可能会考虑编写输入运算符。如果您发现无法读取任何内容,则需要找出输入错误的位置,例如,输出您在每个子表达式后成功读取的值,例如:

for(i = 0; i != arrSize
           && inFile >> number && std::cout << "number=" << number << '\n'
           && std::getline(inFile, lastName, ',') && std::cout << "name='" << lastName << "'\n"
           && std::getline(inFile, firstName) && std::cout "first-name='" << firstName << '\n'
           && inFile >> previous && std::cout << "previous=" << previous << '\n'
           && inFile >> current && std::cout << "current=" << current << '\n'
           && inFile >> therms && std::cout << "therms=" << therms << '\n'; ++i) {
    // set the various values
}