需要有关标记文本文件并存储在向量

时间:2015-11-18 05:38:16

标签: c++ vector sqlite

我正在阅读一个看起来像这样的文本文件:

1|Pink Floyd
2|Genesis
3|Einaudi
4|Melanie C

我有一个矢量artistVector来存储ID(整数)和Artist Name char(100)。

我正在尝试解析文本文件并存储已解析的ID和名称,如下所示:

artistVector[0] = 1
artistVector[1] = Pink Floyd
artistVector[2] = 2
artistVector[3] = Genesis
artistVector[4] = 4
artistVector[5] = Einaudi
artistVector[6] = 6
artistVector[7] = Melanie C

但由于某种原因,我在Pink Floyd之后的代码不能使用我的sqlite插入记录功能。

static vector<string> readFile(vector<string> artVec, ifstream &iFile) //Read the file into the vector function definition
{
vector<string> vector;
string line;
if (iFile.is_open()) {
    while (!iFile.eof()) {
        // read an item using | as a delimiter
        //getline(artist, line, '|');
        getline(iFile, line, '|');
        vector.push_back(line);

        getline(iFile, line, '\n');
        vector.push_back(line);
        getline(iFile, line, '\n');
        vector.push_back(line);
    }
}
else {
    cout << "Unable to open file";
}
return vector;
}

int main() {

vector<string> artistVector;
ifstream artistFile("artist.txt"); //Input file

artistVector = readFile(artistVector, artistFile);
std::string sqlArtistInsert[8];

for (int i = 0; i < artistVector.size(); i++) {
    sqlArtistInsert[i] = artistVector[i];
}
cout << sqlArtistInsert[0] << endl;
cout << sqlArtistInsert[1] << endl;
cout << sqlArtistInsert[2] << endl;



system("pause");
return 0;
}

我的输出如下:

1
Pink Floyd

2

请注意Pink Floyd和2之间的空白区域?又名sqlArtistInsert [1]&amp; sqlArtistInsert [2]

请查看下面的代码,我们非常感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

我看到的问题:

while循环

中的问题
while (!iFile.eof()) {
    // read an item using | as a delimiter
    //getline(artist, line, '|');
    getline(iFile, line, '|');
    vector.push_back(line);

    getline(iFile, line, '\n');
    vector.push_back(line);
    getline(iFile, line, '\n');
    vector.push_back(line);
}

getline的最后一次通话将会读取另一行文字。第一次执行循环时,

line的第一次通话中,

"1"将被分配getlineline的第二次通话中,"Pink Floyd"将被分配getlineline的第三次调用中,"2|Genesis"将被分配getline

我确信这不是你的意图。删除循环中对getline的第三次调用。

另一个问题是,您最终会在vector中存储的项目数量超过文件中的数量。有关更深入的说明,请参阅Why is iostream::eof inside a loop condition considered wrong?。你的循环必须是这样的:

  while (getline(iFile, line, '|')) {
     vector.push_back(line);

     getline(iFile, line, '\n');
     vector.push_back(line);
  }

sqlArtistInsert 中<{1}}的尺寸不足

当前大小为main时,由于8循环中的问题,程序使用的内存超出了有效限制。固定while循环后,这不再是问题。

为了安全起见,我会使用:

while