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

时间:2015-08-14 10:10:22

标签: c++ file c++11 graph stdvector

我是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. 我想从7号线开始阅读,即1 0等等。
  2.   
  3. 如何从7号线开始阅读?
  4.   

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

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

Please let me know, how to do it?

我希望将Nodes和CommId分成两个单独的整数。一旦我在一个整数中有Node,我想从一个Graph文件中搜索这个节点的邻居节点(这个文件也作为输入提供,它有边信息)。在获得此节点的邻居之后,我想存储收集的邻居及其CommId(每个节点的commId可从上面的文件中获得)。我想将它们作为对存储在Array / Vector中。

例如:

  

从此文件中读取1 0后。我将采用节点1和意志   从图形文件中找到节点1的邻居。对于每个邻居   在节点1中,我想将信息保存为一对。例如,如果   节点1有两个邻居节点。即节点63和节点55.如果节点63   属于commId 100,节点55属于CommId 101,该对   应该是:

     

[(63,100),(55,101)..]等等。

学习链接,STackOverflow论坛建议我使用Vector,Map,STructs for Graphs。我之前的任何时候都没有使用过Vector / Maps,Structs。我之前使用过它,我知道Array。

请建议最好的方法。

提前致谢。非常感谢每一个帮助。

2 个答案:

答案 0 :(得分:1)

您可以通过以下方式从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;

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

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 .....

答案 1 :(得分:1)

  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;
}