2013-09-12 2 views
2

Я сталкиваюсь с ошибкой segmenatation в fread, пока я читаю 1500 или более пакетов данных Ethernet. Здесь «test2» - это двоичный файл с размером файла 22,6 МБ. 1132 - количество полезных точек данных в каждом пакете, а 142 точки содержат информацию заголовка, поэтому она пропускается.Ошибка переключения в файле

здесь основная программа:

void main() 
{ 
    int count; 
    FILE *fp; 
    long file_size; 
    unsigned char rawdata[1132]; 

    fp=fopen("test2","rb"); 

    if(fp==-1) 
    { 
     printf("unsucessful"); 
     exit(0); 
    } 

    long int before=ftell(fp); 

    fseek(fp,0,SEEK_END); 
    file_size=ftell(fp); 
    rewind(fp); 

    long int after=ftell(fp); 

    //skip first 142 bytes(header information)since its not required 
    fseek(fp,142,SEEK_SET); 

    long int s=ftell(fp); 
    int length_of_fft=4096; 
    int buffer_width=128; 
    int buffer_depth=1024; 
    int k,aa,payloadindex=0,l=0,j,a; 
    int no_of_data_pts_to_be_read=1132; 
    int no_of_ethernet_pkts_to_be_read=1500; 
    int q=no_of_ethernet_pkts_to_be_read*buffer_depth; 
    unsigned char payload[q]; 
    unsigned int payloadint[q]; 
    int no_of_data_pks_read=0; 
    int reading_for_first_time=1; 
    unsigned char data_from_file[no_of_ethernet_pkts_to_be_read][buffer_depth]; 
    int addr_offset_in_inarray=0; 
    int udp_counter_values[no_of_ethernet_pkts_to_be_read]; 
    unsigned int rawdataint[1132]; 
    long int size; 

    count=0; 

    for(a=0; a<no_of_ethernet_pkts_to_be_read; a++) 
    { 
     int p=fread(rawdata,1 ,sizeof(rawdata), fp); 

     count=p; 

     //----------- to check if all data points have been read, i,e the pointer must be at a position wich is a multiple of 1132 which is[(1274-142=1132)*(a+1)],(since 142 bytes were skipped in the beginning) 
     printf("\n\n %d\t Start=%x\t\t Stop=%x\t Count=%d\t Address=%x",no_of_data_pks_read, rawdata[0], rawdata[sizeof(rawdata)-1],count, 
     ftello(fp)); 

     if(count==no_of_data_pts_to_be_read) 
     { 
      printf("\nNumber of data points read in packet %d (of %d) is %d ",no_of_data_pks_read, no_of_ethernet_pkts_to_be_read, count); 
      reading_for_first_time=0; 

      //--------------converting char array rawdata into int array and then call udp 
      for(i=0;i<1132;i++) 
       rawdataint[i]=rawdata[i]-'\0'; 

      udp_counter_values[a]=check_UDPpacketCount(&addr_offset_in_inarray, &rawdataint,10,no_of_data_pks_read,1132); 
      // printf("\n--------udp:: %d ",udp_counter_values[a]); 

      //-----------------create new mat and compute payload and put the contents of array rawwdata into the respective row of the new matrix 
      int k,t,w,time=0; 

      for(k=0,l=addr_offset_in_inarray;l<sizeof(rawdata),k<1024;k++,l++) 
      { 
       data_from_file[no_of_data_pks_read][k]=rawdata[l];  

       // printf("\n datafile:%d",data_from_file[no_of_data_pks_read][k]); 
      } 

      for(t=0;t<1024;t++) 
      { 
       payload[payloadindex++]=data_from_file[no_of_data_pks_read][t]; 
      } 

      no_of_data_pks_read++; 
     } 
     else 
     { 
      count=0; 
      printf("\n not equal, exiting "); 
      exit(0); 
     } 
    } 

    //------convert payload to int array and send to data extraction function 
    for(i=0;i<sizeof(payload);i++) 
    { 
     payloadint[i]=payload[i]-'\0'; 
    } 
    printf(" sizepayload: %d", sizeof(payload)); 
    size=sizeof(payload); 
    data_extraction(size, payloadint,buffer_depth,buffer_width,length_of_fft); 
    printf("\n s:%d",file_size); 
    printf("\n ft:%x",ftell(fp)); 
    printf("\n****----end----****"); 
    fclose(fp); 
} 
+2

Вы пытались использовать отладчик? – HAL

+2

... или более короткие строки в этом отношении? :-) – SzG

+0

есть. Использовал GDB, он дал ошибку segmenatation в fread – Mary

ответ

0

Как уже упоминалось, вы можете использовать весь свой стек, попробуйте сделать все статически распределенные переменные глобальными или использовать динамическое распределение. Это должно улучшить вашу ситуацию.

+0

Ну, комментарий Whoz Craig действительно помог. Динамическое распределение фактически решило мою проблему. Спасибо за помощь – Mary

0

fopen() возвращает NULL указатель на ошибку, а не -1. Если fopen не удалось, вы продолжаете и выполняете операции с помощью указателя NULL.

Это неправильно:

fp=fopen("test2","rb"); 
if(fp==-1) 
{ 
    printf("unsucessful"); 
    exit(0); 
} 

Это должно быть (и смотреть мое использование пробелов)

fp = fopen("test2", "rb"); 
if (fp == NULL) { 
    printf("Could not open test2\n"); /* A meaningful error message */ 
    exit(0); 
} 
+0

тоже пробовал это, но не произошло – Mary

0

Есть несколько ошибок в коде.

1.you нужен проверить fp==NULL вместо fp==-1 когда-либо fopen() не удается, то возвращается NULL

2 цикла используется запятой, я предполагаю, что это AND.

for(k=0,l=addr_offset_in_inarray;l<sizeof(rawdata),k<1024;k++,l++) 
               ^
for(k=0,l=addr_offset_in_inarray;((l<sizeof(rawdata))&& (k<1024));k++,l++)  
                 ^^ 

3.did не объявлена ​​переменная i.

предупреждения необходимо удалить
Вы не использовали много переменных, даже если они инициализируются со значениями
типа рассогласование при печати.

ОБНОВЛЕНО КОД

#include<stdio.h> 
#include<stdlib.h> 
#include<string.h> 


void main() 

{ 

int count,i; 

FILE *fp; 

long file_size; 

unsigned char rawdata[1132]; 

fp=fopen("test2","rb"); 

if(fp==NULL) 

{ 

printf("unsucessful"); 

exit(0); 

} 

long int before=ftell(fp); 

fseek(fp,0,SEEK_END); 

file_size=ftell(fp); 

rewind(fp); 

long int after=ftell(fp); 


//skip first 142 bytes(header information)since its not required 

fseek(fp,142,SEEK_SET); 

long int s=ftell(fp); 


int length_of_fft=4096; 

int buffer_width=128; 

int buffer_depth=1024; 

int k,aa,payloadindex=0,l=0,j,a; 

int no_of_data_pts_to_be_read=1132; 

int no_of_ethernet_pkts_to_be_read=1500; 

int q=no_of_ethernet_pkts_to_be_read*buffer_depth; 

unsigned char payload[q]; 

unsigned int payloadint[q]; 

int no_of_data_pks_read=0; 

int reading_for_first_time=1; 

unsigned char data_from_file[no_of_ethernet_pkts_to_be_read][buffer_depth]; 

int addr_offset_in_inarray=0; 

int udp_counter_values[no_of_ethernet_pkts_to_be_read]; 

unsigned int rawdataint[1132]; 

long int size; 


count=0; 



     for(a=0; a<no_of_ethernet_pkts_to_be_read; a++) 

     { 

      int p=fread(rawdata,1 ,sizeof(rawdata), fp); 

      count=p; 

//----------- to check if all data points have been read, i,e the pointer must be at a position wich is a multiple of 1132 which is[(1274-142=1132)*(a+1)],(since 142 bytes were skipped in the beginning) 


      printf("\n\n %d\t Start=%x\t\t Stop=%x\t Count=%d\t Address=%x",no_of_data_pks_read, rawdata[0], rawdata[sizeof(rawdata)-1],count,(unsigned int) ftell(fp)); 

      if(count==no_of_data_pts_to_be_read) 

      { 

       printf("\nNumber of data points read in packet %d (of %d) is %d ",no_of_data_pks_read, no_of_ethernet_pkts_to_be_read, count); 

      reading_for_first_time=0; 

      //--------------converting char array rawdata into int array and then call udp 





       for(i=0;i<1132;i++) 

       rawdataint[i]=rawdata[i]-'\0'; 

       udp_counter_values[a]=check_UDPpacketCount(&addr_offset_in_inarray, &rawdataint,10,no_of_data_pks_read,1132); 

       // printf("\n--------udp:: %d ",udp_counter_values[a]); 


//-----------------create new mat and compute payload and put the contents of array rawwdata into the respective row of the new matrix 


       int k,t,w,time=0; 

       for(k=0,l=addr_offset_in_inarray;(l<sizeof(rawdata)|| k<1024);k++,l++) 

       { 

       data_from_file[no_of_data_pks_read][k]=rawdata[l]; 

       // printf("\n datafile:%d",data_from_file[no_of_data_pks_read][k]); 


       } 


       for(t=0;t<1024;t++) 

       { 

        payload[payloadindex++]=data_from_file[no_of_data_pks_read][t]; 

       } 

      no_of_data_pks_read++; 

     } 

     else 
       { 

        count=0; 

        printf("\n not equal, exiting "); 

        exit(0); 

       } 

     } 

//------convert payload to int array and send to data extraction function 

      for(i=0;i<sizeof(payload);i++) 

     { 

      payloadint[i]=payload[i]-'\0'; 


     } 

    printf(" sizepayload: %ld", sizeof(payload)); 

    size=sizeof(payload); 


data_extraction(size, payloadint,buffer_depth,buffer_width,length_of_fft); 

printf("\n s:%ld",file_size); 

printf("\n ft:%x",(unsigned int)ftell(fp)); 


printf("\n****----end----****"); 

fclose(fp); 

} 
+0

Использовал тот же код, но все же не улучшил – Mary

+0

опубликовать весь ваш код. – Gangadhar

+0

Вы хотите, чтобы я опубликовал код функций? – Mary

0

Если вы на Unix-подобную платформу, вы могли бы заменить fopen, fread, fseek звонков с необработанными системными вызовами, просто чтобы посмотреть, что происходит.

#include <unistd.h> 
#include <fcntl.h> 
#include <sys/types.h> 
int fd = open("test2", O_RDONLY); 
if (fd < 0) { 
    printf("Could not open test2\n"); 
    exit(0); 
} 

И затем использовать read() вместо fread(), lseek() вместо fseek() и т.д..

Смежные вопросы