使用c ++从多个.txt文件中读取数据

时间:2014-08-16 23:06:55

标签: c++ unix filereader

我需要从目录中的多个文件(64个文件)中提取一系列信息。每个文件包含几行,如:

操作员对:0& ins:0& rmv:0&重量:0.124354

一对运营商:1& ins:1& rmv:0&重量:0.00672458

一对运营商:2& ins:2& rmv:0&重量:0.000467531

...

信息存储在矢量中。我写了一段代码,然而,我收到了一个分段错误错误。这是我的代码。任何人都可以指出问题的来源吗?

#include <iostream>
#include <fstream>
#include <stdio.h>
#include <string.h>
#include <vector>
#include <dirent.h>

using namespace std;

struct info {
    char* name;
    vector<vector<double>> weights; // dest-const-weight
};

int main(int c, char* v[]) {
    struct dirent* pDirent;
    DIR* pDir;
    char buffer[50];
    strcpy(buffer, v[1]);

   if (c < 2) {
      printf ("Usage: testprog <dirname>\n");
      return 1;
   }

   pDir = opendir (buffer);

   if (pDir == NULL) {
       printf ("Cannot open directory '%s'\n", v[1]);
       return 1;
   }

    vector<info> Information;
    for (int inst = 0; inst < 64; inst++) {
        info temp;
        temp.weights.resize(9);
        for (int j = 0; j < 9; j++)
            temp.weights[j].resize(4);
        Information.push_back(temp);
    }
    int cmp = 0;
    while ((pDirent = readdir(pDir)) != NULL) {
        if (strcmp(pDirent->d_name, ".") != 0 &&
            strcmp(pDirent->d_name, "..") != 0) {
            char line[1024];
            ifstream file(pDirent->d_name);
            Information[cmp].name = pDirent->d_name;
            int oper = -1;
            int dest = -1;
            int ins = -1;
            double weight = -1;

            for (int l = 0; l < 36; l++) {
                file.getline(line, 1024);
                // cout<<line<<endl;
                sscanf(line,
                       "Pair of Operators: %d& ins: %d& rmv: %d&  weight: %f",
                       &oper, &dest, &ins, &weight);
                // sscanf(line, "%*s %d%*s %d%*s %d%*S %f", &oper, &dest, &ins,
                // &weight);
                // cout<<oper<<"   "<<dest<<"   "<<ins<<"   "<<weight<<endl;
                Information[cmp].weights[dest][ins] = weight;
            }
            cmp++;
        }
    }

    closedir(pDir);
    return 0;
}

1 个答案:

答案 0 :(得分:1)

我可以看到两个明显的seg错误。 首先,将v[1]复制到缓冲区中。您是否为您的计划提供任何论据? 我在飞行中看到的第二个是你尝试在未初始化的DIR指针上调用readdir。 试试DIR* pDir = opendir(...);

当参数计数不匹配时,您应该始终打印用法消息!

if (c != 1) {
  fprintf(stderr, "USAGE: %s needs exactly one argument!\n" v[0]);
  return 0;
}

我还忘了提一件事。您可以使用-g标志编译程序,并尝试使用调试器来查找这些错误。