从特定行读取 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
和它们对应的 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;
}
我有两个问题:
- I want to start reading from Line 7 i.e 1 0 and so on.
- 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;
}
我是 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;
}
我有两个问题:
- I want to start reading from Line 7 i.e 1 0 and so on.
- 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;
}