2016-03-12 100 views
0

我有一个任务,我有一个问题。我必须读取.ts文件,读取里面的数据包,并从每个数据包中提取标题信息。 我已经创建了一个结构数据包,它将保存标题的所有信息,并且我还有一个向量,在该数据包中我将push_back每个数据包。 问题在于for循环在163rd循环中由于某种原因而停止。如果我循环直到让我说我= 160,然后代码转义结束循环,但是当我打印vector.size()我得到一个非常大的数字,这是没有意义的。我想它应该是一个整数值高达Packets.Here的推回数是代码,我迄今为止:奇怪行为的结构向量C++

int main() { 


FILE *ts_file = NULL; 
ts_file = fopen64("/home/ddd/Desktop/Assignment/Streams/ddd.ts", "rb"); 

if (ts_file == NULL){ 
    cout << "No file detected on this path, try again" << endl; // prints !!!Hello World!!! 
} 

TS_Analyzer *ts_analyzer; 
ts_analyzer->parse_file(ts_file); 


cout << "Finished main" << endl; 
return 0; 

}

空隙TS_Analyzer :: parse_file(FILE * ts_file) {

cout << "Inside parser" << endl; 

fseek(ts_file,0,SEEK_END); 
long file_size = ftell(ts_file); 
rewind (ts_file); 

number_of_packets = file_size/PACKET_SIZE; 
unsigned int current_header_add = 0; 
unsigned int i=0; 


for (unsigned int j=1; i<number_of_packets; j++) 
{ 
    i++; 
    unsigned char TS_raw_header[4]; 

    cout << "current position " << int(current_header_add) << endl; 

    current_header_add = ftell(ts_file); 

    fread(&TS_raw_header, sizeof(TS_raw_header), 1, ts_file); 

    Packet current_packet; 

    current_packet.sync_byte = TS_raw_header[0]; 
    current_packet.transport_error_indicator = (TS_raw_header[1] & 0x80) >> 7; 
    current_packet.payload_start_indicator = (TS_raw_header[1] & 0x40) >> 6; 
    current_packet.transport_priority = (TS_raw_header[1] & 0x20) >> 5; 
    current_packet.PID = ((TS_raw_header[1] & 31) << 8) | TS_raw_header[2]; 
    current_packet.transport_scrambling_control = (TS_raw_header[3] & 0xC0); 
    current_packet.adaption_field_control = (TS_raw_header[3] & 0x30) >> 4; 
    current_packet.continuity_counter = (TS_raw_header[3] & 0xF); 


    stream_packets.push_back(current_packet); 

    //cout << hex << int(current_packet.PID) << endl; 
    //cout << dec << "continuity counter " << int(current_packet.continuity_counter) << endl; 
    cout << " i " << int(i) << endl; 

    fseek(ts_file, 184, SEEK_CUR); 
} 
cout << "@@" << endl; 
cout << stream_packets.size() << endl; 

}

类TS_Analyzer:公共分析器{

p ublic: TS_Analyzer(); 〜TS_Analyzer();

struct Packet { 
    unsigned char sync_byte; 
    unsigned char transport_error_indicator; 
    unsigned char payload_start_indicator; 
    unsigned char transport_priority; 
    unsigned int PID; 
    unsigned char transport_scrambling_control; 
    unsigned char adaption_field_control; 
    unsigned char continuity_counter; 
}; 

std::vector<Packet>stream_packets; 

int number_of_packets = 0; 


void parse_file(FILE *); 

};

为什么矢量push_back打破for循环以及为什么我无法获得正确的矢量大小的任何想法?

+1

我们可以看到错误吗? –

+0

这不是一个错误,它只是停在163rd循环上。当我把循环让我们说直到111,然后循环完成,如果我打印矢量的大小我得到那11727604084342. – jmfel

+0

什么是PACKET_SIZE?它没有定义。分析仪类的功能是什么?也没有定义。 fopen64()使用...它可以比2GB文件更大吗?在这种情况下,long可能不能包含目标平台上的长度。系统地忽略了各种其他功能(fseek fread等)返回的结果,因此无论如何它都不会将审查作为实际生产代码进行通过。还有未初始化的对象使用了JVApen已经回答的问题,大多数编译器都会抱怨它。 –

回答

1

如果我通过铛编译器把这个代码,我得到下面的代码中的错误:

TS_Analyzer *ts_analyzer; 
ts_analyzer->parse_file(ts_file); 

>> variable 'ts_analyzer' is uninitialized when used here 

我猜你遇到不确定的行为:作为ts_analyzer作为PTR是任何随机值,在数据的成员也非常随意。

我真的很惊讶,这段代码在没有崩溃的情况下运行,尽管你总是很幸运。

如果你想解决这个问题,尝试通过在堆栈创建对象避免指针:

TS_Analyzer ts_analyzer; 
ts_analyzer.parse_file(ts_file); 

,或者如果你真的需要分配的内存,至少在指针填写:

auto ts_analyzer = std::make_unique<TS_Analyzer>(); 
ts_analyzer->parse_file(ts_file); 
+0

是的,这很可能是因为std :: vector stream_packets;位于未初始化的某个随机存储器位置,因此可以轻松输出11727604084342作为其大小。 –

+0

我会尽快检查未初始化的对象,目前我不在电脑上,我会尽快回复您。 – jmfel

+0

好吧,我从一个指针改变到堆栈中的一个对象,现在它工作得很好。循环结束并且矢量大小可以。非常感谢 ! – jmfel