从特定行读取 C++ 文件,然后将其存储在 Vectors/Array

Read a file in C++ from a specific Line and then store it in Vectors/Array

我是 C++ 编程的新手,我做了阅读文件的作业。我正在从这个 cpp-tutorial: Basic-file-io 站点学习 C++。

我有一个文件,其内容如下:

Input: /path/to/the/file/
Information :xxx
Type of File: Txt file
Extra Information Value = 4
Development = 55
NId      CommId
1        0
3        0
8        7
.   .
And so on...

这个文件有大约 10000 Nodes 和它们对应的 CommIDNode and CommId 在此文件中由 TAb space 分隔。我正在使用以下代码将此文件作为输入读取:

ifstream commFile("CommTest.txt");
if (!commFile)
       {
         // Print an error and exit
    cerr << "Uh oh, CommunityTest File could not be opened for reading!" << endl;
                 exit(1);
             }
while(commFile)
{
    // read communityFile from the 6th Line
    string strLine;

    getline(commFile, strLine);
    cout << strLine << endl;

}

我有两个问题:

  1. I want to start reading from Line 7 i.e 1 0 and so on.
  2. How can I start reading it from the line 7?

我查了很多问题,发现如果txt文件的行长度不同,就无法跳转到行号。

我想知道如何使用 seekg 在到达第 7 行之前我需要计算位数。

Please let me know, how to do it?

我想在两个单独的整数中获取节点和 CommId。一旦我有一个整数节点,我想从一个图形文件中搜索这个节点的邻居节点(这个文件也作为输入提供,它有边缘信息)。得到这个Node的Neighbors后,我想存储收集到的Neighbors和他们的CommId(每个Node的commId可以从上面的文件中得到)。我想将它们成对存储在 Array/Vector.

例如:

After reading 1 0 from this file. I will take the Node 1 and will find the Neighbours of Node 1 from a Graph File. For every Neighbours of Node 1, I want to save the information as a pair. For example, if Node 1 has two Neighbours Node. i.e Node 63 and Node 55. If Node 63 belong to commId 100 and Node 55 belongs to CommId 101, the pair should be:

[(63,100),(55,101)..] and so on.

学习link,Whosebug论坛建议我使用Vectors,Map,Structs for Graphs。我一生中从未使用过 Vector/Maps,Structs。我知道 Array 因为我以前用过它。

请提出最佳方法。

提前致谢。我们将不胜感激。

你可以通过这个从 7 行读取文本文件:

for (int lineno = 0; getline (myfile,line) && lineno < 7; lineno++)
  if (lineno > 6)
      cout << line << endl;

从#7 行得到 NId and CommId 后,您可以将其放入 stringstream 中。你可以从stringstream

学习
std::stringstream ss;
ss << line;
int nId,CId;
ss >> nId >> CId;

然后可以采用二维数组,我认为你必须处理二维数组,如果

array[row][column]

每个 row 定义为 NId 并在一行中对应您并将 commId 存储为 column 值。

根据您的示例:[(63,100),(55,101)..] 等等。

Here NId 63, 55 .....
So you can..
array[63][0] = 100
array[55][0] = 101
so on....

您可以通过 count 来处理列值,例如 0,1,2.....

  int main(int argc, char **argv) {
    vector<int> nodes;
    map<int, vector<int> > m;
    ifstream commFile("file.txt");
    string strLine, node_string;
    int node;
    if (!commFile.is_open()) {
        cerr << "Uh oh, CommunityTest File could not be opened for reading!" << endl;
        return -1;
    }
    // Ignore the first lines of your file, deal with the empty lines
    for(int i = 0; i < 12 && std::getline(commFile,strLine); i++) {
        cout << "Line to ignore = " << strLine << endl;
    }

    while(getline(commFile,strLine)) {
        istringstream split(strLine);
        // split the string with your nodes
        while(getline(split, node_string, ' ')) {
            std::istringstream buffer(node_string);
            buffer >> node;
            // push it into a temporary vector
            nodes.push_back(node);
        }
        if(nodes.size() >= 2) {
            // add into your map
            m[nodes[0]].push_back(nodes[1]);
        }
    }
    return 0;
}