2

1500 以上のイーサネット データ パケットを読み取っているときに、fread でセグメンテーション エラーが発生します。ここで「test2」はファイルサイズが22.6MBのバイナリファイルです。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);
}
4

4 に答える 4

0

コードにいくつかのエラーがあります。

1.失敗したときにNULLを返すfp==NULLのではなく、チェックする必要がありますfp==-1fopen()

2. for ループでコンマを使用していますが、それは 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.変数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);

}
于 2013-09-12T09:15:04.973 に答える
0

fopen()-1 ではなく、エラー時に NULL ポインタを返します。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);
}
于 2013-09-12T08:58:10.070 に答える
0

すべてのスタックを使い果たしている可能性があることは既に述べたように、静的に割り当てられたすべての変数をグローバルにするか、動的割り当てを使用してみてください。それはあなたの状況を改善するはずです。

于 2013-09-12T17:55:51.483 に答える