ページ 11

fscanfで読み飛ばしながら特定のデータを読み込ませたい

Posted: 2017年11月25日(土) 18:00
by hallive

コード:

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

#define maxstring 120
#define maxdata 100000
typedef struct tracedata
{
    double time;//Time
    
    int nodenum;//ノード番号
    char method[maxstring];//メソッド
    char event[maxstring];//イベント
    char packetid[maxstring];//パケットid
}Tracedata;

int main(){
	FILE *fp;
	Tracedata tracedata[maxdata];
    char buf[maxstring];
    char filename[]="scenario.trace";
    
    int packetsize=500;//1パケット当たりのサイズ
	int tuusinjikan=50;//通信時間

    fp=fopen(filename,"r");
	if (fp == NULL)
    {        
    	printf("ファイルオープンエラー\n");
        return -1;
    }
    
    //ファイル読み込みと各変数に代入
    int i;
    i=0;
   
     while(fscanf(fp,"%*s%lf%*s%d%*s%s%*s%*s%s%*s%s",&tracedata[i].time,&tracedata[i].nodenum,&tracedata[i].method,&tracedata[i].event,&tracedata[i].packetid)!=EOF){
    
        i++;
    }
 
    fclose(fp);
 
}

コード:

scenario.traceファイル
T= 96.128309281 N= 104 M= Udp Id=  Ev= UdpSend PktId= 104_339
T= 96.128309281 N= 104 M= Udp Id=  Ev= UdpSend PktId= 104_339
T= 96.128309281 N= 104 M= Udp Id=  Ev= UdpSend PktId= 104_339
ネットワークの勉強をしている者です。各項目の=以降のデータを各変数に入れたいのですが、なぜか異常終了してしまいます
たとえばT= 96.128309281のばあいtracedata.timeに代入したい値は96.128309281の部分です
ほかの値も同様です

これが出来なければ卒論が終わらせられず困っています。回答よろしくお願いいたします。

Re: fscanfで読み飛ばしながら特定のデータを読み込ませたい

Posted: 2017年11月25日(土) 18:20
by みけCAT
double型、int型、char型のサイズがそれぞれ8バイト、4バイト、1バイトと仮定すると、struct tracedataは少なくとも372バイトであり、
配列tracedataは約35MiBになります。
このような大きな配列を静的でないローカル変数として確保すると、通常はスタックに確保されるので、例えばスタックが8MiBしかない環境では落ちる可能性が高いでしょう。
この問題を避けるには、配列tracedataを静的変数にする (ローカル変数のままでstaticをつけるか、グローバル変数にする) か、
mallocなど通常ヒープに確保される方法で動的確保するといいでしょう。

Re: fscanfで読み飛ばしながら特定のデータを読み込ませたい

Posted: 2017年11月27日(月) 15:00
by hallive
ありがとうございます!解決しました
ためしにmaxdataを1000にしたらきちんと動作しました