我有一个.txt文件,我试图从中收集数据,然后可以在我的代码中的变量内使用,用于其他函数。
下面是我的文本文件的一个例子:
0 10 a namez 1 0
0 11 b namea 1 1
1 12 c nameb 1 1
2 13 d namec 0 1
3 14 e named 1 1
所以我的文件不会总是相同的行数,但每行变量的数量总是相同的。
我目前有这个,首先得到文件的长度,然后改变数组内的行数:
int FileLength()
{
int linecount = 0;
string line;
ifstream WorkingFile("file.txt");
while(getline(WorkingFile, line))
{
++linecount;
}
return linecount;
}
int main()
{
string FileTable [FileLength()][6];
}
首先,我不知道上面的代码是否正确,或者如何将我的文件中的值添加到我的FileTable
数组中。
一旦我有了包含所有文件数据的FileTable
数组,我就希望能够在其他函数中使用它。
I've been able do:
if(FileTable[2][0] = 1)
{
cout << "The third name is: " << FileTable[2][3] << endl;
}
我知道我的代码在这里可能没有意义,但我希望它能说明我想做的事情。
对于一个较大的文本文件,我必须这样做,并且每行的所有6个变量都与输入函数有关。
将每一行保持在自己的对象中,这样更清晰:
struct Entry
{
std::array<std::string, 6> items; // or a vector
};
在主要:
std::vector<Entry> file_table( FileLength() );
请注意,首先读取整个文件以查找条目数是浪费时间的。你可以从一个空向量开始,然后在读取它时将每一项压入。
您的访问码:
if( file_table.size() > 2 && file_table[2].items[0] == "1" )
{
cout << "The third name is: " << FileTable[2].items[2] << endl;
}
我实际上建议给Entry
的成员命名,而不是仅仅有一个6个成员的数组。这将使您的代码更具可读性。(除非你真的需要遍历它们,在这种情况下,你可以使用枚举作为索引)。
如果你不喜欢.items
位,你可以为Entry
定义一个operator[]
过载
由于行数是动态的,我建议使用向量而不是数组。您可以逐行将数据推回向量,直到读取eof。也试着学习一下OOP,它会使你的代码更容易理解。
看看这些:
http://www.cplusplus.com/reference/vector/vector/http://www.geeksforgeeks.org/eof-and-feof-in-c/