2015-08-14 1 views
-2

Я новичок в программировании на C++, и я сделал домашнее задание для чтения файла. Я изучаю C++ с этого сайта cpp-tutorial: Basic-file-io.Прочитайте файл на C++ с определенной строки, а затем сохраните его в Vectors/Array

У меня есть файл, содержимое которого выглядит следующим образом:

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; 

} 

У меня есть два вопроса:

  1. Я хочу, чтобы начать чтение из строки 7 1 0 т.е. и так далее.
  2. Как я могу начать читать его из строки 7?

Я проверил много вопросов и наткнулся, что это не возможно, чтобы перейти к номеру строки, если строки в текстовых файлах имеют разную длину.

Интересно, как использовать seekg, в котором мне нужно подсчитать биты, прежде чем я могу достигнуть линии 7.

Please let me know, how to do it? 

Я хочу, чтобы получить узлы и CommId в двух отдельных Целые. Как только у меня есть Node в Integer, я хочу выполнить поиск в Neighbor Nodes этого узла из графического файла (этот файл также предоставляется как вход, и он имеет информацию о краях). После получения соседей этого узла я хочу сохранить собранные соседи и их CommId (commId каждого узла доступен из вышеупомянутого файла). Я хочу сохранить их как пару в массиве/векторе.

Например:

После прочтения 1 0 из этого файла. Я возьму Узел 1 и найду Соседей Узел 1 из графического файла. Для каждого Neighbors узла Node 1 я хочу сохранить информацию в виде пары. Например, если Узел 1 имеет два узла соседей. Узел 63 т.е., и узел 55. Если узел 63 принадлежат commId 100 и узел 55 принадлежит к CommId 101, пара должно быть:

[(63100), (55101) ..] и так далее.

Учебная ссылка, форум STackOverflow предложил мне использовать Vectors, Map, STructs for Graphs. Я не использовал Vector/Maps, Structs в любое время в моей жизни. Я знаю, как я использовал его раньше.

Просьба предложить, какой был бы лучший способ.

Заранее спасибо. Любая помощь будет принята с благодарностью.

+1

Вы помещаете счетчик в цикле и пропустить обработку линии читать до тех пор, счетчик достигает 7? –

ответ

1

вы можете прочитать текстовый файл с 7 нет строки этим:

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

после получения NId and CommId от # 7 линии, вы можете взять его в stringstream. Вы можете узнать его из stringstream

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

Тогда можно взять 2D массив, и я думаю, вы должны обрабатывать 2D массив, если

array[row][column] 

Каждый row определяем как NId и соответствующий подряд вы и хранить commId, как a 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 .....

+0

Ничего себе. Это был быстрый ответ. Большое спасибо за ответ и предложение. Я попробую предложенный метод и вернусь в случае, если у меня возникнут некоторые проблемы. Еще раз спасибо :) –

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; 
} 
Смежные вопросы