我需要从目录中的多个文件(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;
}
答案 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
标志编译程序,并尝试使用调试器来查找这些错误。