C++ 将列解析为数组,同时区分行中的内容

C++ 将列解析为数组,同时区分行中的内容,c++,C++,我试图解析一个输出的文本文件,如下面的示例所示,我的示例有有限的条目,但我的实际条目超过15000行,因此我无法单独读取这些内容: ID IC时间 15:23:43.867/g/mydata/dataoutputfile.txt标识符 0003 1233 abcd 0043 eb54 abf3 000f 0bb4 ac24 000a a325 ac75 0023 0043 ac91 15:23:44.000/g/mydata/dataoutputfile.txt标识符 0003 1233 abc

我试图解析一个输出的文本文件,如下面的示例所示,我的示例有有限的条目,但我的实际条目超过15000行,因此我无法单独读取这些内容:

ID IC时间

15:23:43.867/g/mydata/dataoutputfile.txt标识符

0003 1233 abcd

0043 eb54 abf3

000f 0bb4 ac24

000a a325 ac75

0023 0043 ac91 15:23:44.000/g/mydata/dataoutputfile.txt标识符

0003 1233 abcd

0043 eb54 abf3

000f 0bb4 ac24

000a a325 ac75

0023 0043 ac91

这就是我的输出。时间列每隔一段时间重置一次

我现在做的是在我的示例中的3个列之外再制作2个列。第一列是ID列的转换,转换为可理解的消息。第二个附加列将计算每个时间代码之间的差异,时间代码重置时除外

我的逻辑是,将每一列读入一个数组,以便执行必要的转换和操作

我的重点是首先得到时间码的差异,因为我认为得到翻译会更简单一些

我遇到的问题是将条目读入矩阵:

我的代码看起来有点像这样:

while(readOK && getline(myfile,line))
{
stringstream ss(line);
string ident,IC,timehex,time,filelocation;
string junk1,junk2;
int ID[count];
int timecode[count2];
int idx=0;

if(line.find("ID") !=string::npos)
{
     readOK=ss>>ident>>IC>>timehex;
     myfile2<<ident<<"\t\t"<<IC<<"\t\t"<<timehex<<"\t\t"<<"ID Decoded"<<"\t\t"<<"DT"<<endl;
     myfile3<<"headers read"<<endl
}

else if(line.find("identifier") != string::npos)
{
     readOK=ss>>time>>filelocation;
     myfile3<<"time and location read";
     myfile2<<time<<"\t\t"<<filelocation<<endl;
}

else //this is for the hex code lines
{
     readOK=ss>>hex>>ID[idx]>>IC>>timecode[idx];

     if (readOK)
     {
          myfile2<<setw(4)<<setfill('0')<<hex<<ID[1000]<<"\t\t"<<IC<<"\t\t"<<timecode[1000]<<endl;
          myfile3<<"success reading info into arrays"<<endl;
     }

     else
     myfile3<<"error reading hex codes"<<endl;
}
idx++;
}
尽管这段代码不能正常工作。我不能完全一样地读取每一行,因为插入的时间和文件位置条目有助于跟踪我在代码中查看的时间

我的直觉告诉我,我调用矩阵项太早了,它们还没有被填充,因为如果我不能计算1000,我会得到一个0,我的输入文件中有超过15000行,我的数组边界在程序的另一部分中动态设置


我似乎不知道如何正确分配条目,因为每次通过循环时计数变量都会重置为0,因此存在一些继承问题。

在while之前定义while循环范围之外的int idx。现在的情况是,每次通过循环它都会被重置。

@user1412878,如果在循环中定义了它,那么每次通过循环它都会被重置为零。你想要吗?如果是这样,那么为什么在循环结束时增加它呢。我认为seg故障是由于其他原因造成的,可能是由于其正确递增而导致的越界访问。通过调试判断分段故障的最佳方法是什么?我的工具非常有限,因为我正在通过文本编辑器编辑此文件,并且无法访问真正的调试程序。@user1412878,在Linux上,您可以使用gdb,如果您安装了编译工具,则应安装gdb。我不太熟悉Windows,但我认为VisualStudio也有类似的功能。或者你也可以走老路,把printf/cout语句放在代码的关键点。//编辑我找到了它,无论读哪种类型的行,我都在增加idx。它应该只在读取十六进制行时才递增。您需要堆栈跟踪,也称为返回跟踪。一旦在gdb中看到segfault,输入命令“bt”。man gdb也会有所帮助。我开始编辑,将输入文件放入我喜欢的代码块或块引号中,以增加清晰度,但我意识到,我可能会看到一些自动包装的很长的行。也许你应该自己编辑。