我是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
及其对应的CommID
。 Node 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;
}
我有两个问题:
- 我想从7号线开始阅读,即1 0等等。
- 如何从7号线开始阅读?
醇>
我检查了很多问题并且发现如果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。
请建议最好的方法。
提前致谢。非常感谢每一个帮助。
答案 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;
}