循环不会在文件末尾停止

时间:2014-09-21 02:36:26

标签: c++ file loops io

我正在处理文件io,并且我设法将文件中的数据传输到我制作的矢量中,但是当我打印这些值时,我会在最后一部分之后得到垃圾数字。数据。因此,我猜测它不会存在于载体中的推动值,或者它试图打印不存在的载体部分。任何帮助都会很棒。

的main.cpp

#include <iostream>
#include <sstream>
#include <fstream>
#include <vector>
#include <string>
#include "store.h"

using namespace std;

int main ()
{
    store data;
    ifstream inFile ("C:/Users/Owner/Desktop/Albums.csv");
    string line;
    string item;
    int num;
    int itemnum;
    int linenum = 1;
    ostringstream convert;
    string temp;
    while (!inFile.eof())
    {
        while (getline (inFile, line) )
        {
            istringstream linestream(line);
            itemnum = 0;
            num = 0;
            convert << linenum;
            temp = convert.str();
            data.addtovectv(temp);
            while (getline (linestream, item, ',') )
            {
                if (itemnum == 1 || itemnum == 2 || itemnum == 3 || itemnum == 5)
                {
                    num++;
                    data.addtovectfullline(0, item);
                }
                itemnum++;
            }
            linenum++;
        }
    }
    data.print();
    inFile.close();
    return 0;
}

store.h

#ifndef STORE_H
#define STORE_H

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

class store
{
    public:
        store();
        void addtovectv(string);
        void addtovectfullline(int, string);
        void print();

    private:
        vector<string> v;
        vector< vector<string> > fullline;
};

#endif

store.cpp

#include "store.h"

store::store()
{

}
void store::addtovectv(string a)
{
    v.push_back(a);
    fullline.push_back(v);
}
void store::addtovectfullline(int a, string c)
{
    fullline[a].push_back(c);
}
void store::print()
{
    for(unsigned int i=0; i<fullline.size(); i++)
    {
        for(unsigned int j=0; j<fullline[i].size(); j++)
        {
            cout << fullline[i][j] << endl;
        }
        cout << endl;
    }
}

编辑:一些示例数据

RS 500汇编,各种艺术家,太阳唱片集,308

两个名单,A Tribe Called Quest,The Low End Theory,1991,154,Jive,Skeff Anselm,Zombart JK,USA,48:08:52

两个名单,AC / DC,Back in Black,1980,73,ATCO,Robert John Lange,Bob Defrin,Australia / UK,41:36:52

两个名单,AC / DC,Highway to Hell,1979,199,Albert Productions,Robert John Lange,Bob Defrin Australia / UK,41:53:52

我需要阅读这些行,但只将第二,第三,第四和第六条信息放入向量中,这应该是最终打印的内容,每个单独的部分都在新行上。所有数据都存储在.csv文件中

使用此示例数据,我的输出是此屏幕截图:http://puu.sh/bHtHM.png 但是,底部的数字都不应该存在,并且在第一组数据之后有一个奇怪的空间

edit2:意识到奇怪的空间是我要求的数据的缺失,所以很好

2 个答案:

答案 0 :(得分:0)

In.good()不是判断文件是否完成的适当方式。

(来自http://www.cplusplus.com/reference/ios/ios/good/

Ios::eof()检查文件结尾。

Ios::Good()检查打开时没有错误。当读取过去EOF时发生错误时,它可能会退出循环。

答案 1 :(得分:0)

不幸的是,你错误地认识到了什么&#34;!InFile.eof()&#34;正在做但不要担心,因为这在大多数编程课程中都是一个很大的误解。

想想&#34;文件结束检查&#34;作为for循环:

for(int i = 0; i != end of file; i++)
{  
   getinput();  
}  

它总是读取一行传递到文件的末尾,因为它只检查当前行是否由于它位于文件的末尾而无法读取,然后如果不是则递增。这就是你看到人们使用的原因:

while(InFile>>variable)



while(getline(InFile,variable))

而不是

while(!InFile.eof())