2016-06-30 4 views
0

私は2つの外部センサーから読み取ったすべての生データを保存したファイルを書き、ファイルが2Gbになったときにプログラムのデータ書き込みが中断したことを認識しました。ファイル。2Gbを超えるファイルを書き込む

私は次のコードを使用しています

(それが信号を待って、ファイルに書き込み、1つのスレッドです):

while(1) 
{ 
    //Lock, Wait the signal and unlock 
    pthread_mutex_lock(&mutex_WriteOFIMUandGPS); 
    pthread_cond_wait(&cond_WriteOFIMUandGPS, &mutex_WriteOFIMUandGPS); 
    X_CopySnapshot = X_Snapshot; 
    Y_CopySnapshot = Y_Snapshot; 
    Z_CopySnapshot = Z_Snapshot; 
    Vx_CopySnapshot = Vx_Snapshot; 
    Vy_CopySnapshot = Vy_Snapshot; 
    Vz_CopySnapshot = Vz_Snapshot; 
    HPL_CopySnapshot = HPL_Snapshot; 
    HDOP_CopySnapshot = HDOP_Snapshot; 
    StdPosX_CopySnapshot = StdPosX_Snapshot; 
    StdPosY_CopySnapshot = StdPosY_Snapshot; 
    StdPosZ_CopySnapshot = StdPosZ_Snapshot; 
    pthread_mutex_unlock(&mutex_WriteOFIMUandGPS); 


    //Get Time and Date 
    now = time(0); 
    localtm = localtime(&now); 

    //Get millis 
    gettimeofday(&tp, NULL); 
    ms = round(tp.tv_usec/1000); 
    sprintf(buf,"%03d",(int)ms); 

    //Empty strings 
    DateTime = ""; 
    text.clear(); 
    text.str(string()); 

    //Store Data and Time information in a string 
    text << localtm->tm_year+1900 << "/"; 
    text << (((localtm->tm_mon+1)<10) ? "0" : "") << localtm->tm_mon+1 << "/"; 
    text << ((localtm->tm_mday<10)? "0" : "") << localtm->tm_mday << ","; 
    text << ((localtm->tm_hour<10)? "0" : "") << localtm->tm_hour << ":"; 
    text << ((localtm->tm_min<10)? "0" : "") << localtm->tm_min << ":"; 
    text << ((localtm->tm_sec<10)? "0" : "") << localtm->tm_sec << "."<< buf; 
    DateTime = text.str(); 

    //Save data 
    fprintf(fid,"%s," 
      "2,6,0,"       // Alg_ID,SolStatus,EGNOSStatus, 
      "%12.3f,%12.3f,%12.3f,"    // XyzUKF[0],XyzUKF[1],XyzUKF[2], 
      "%8.8f,%8.8f,%8.8f,%7.18f,"   // V_UKF[0],V_UKF[1],V_UKF[2],HPL, 
      "0,0,%5.2f,nan,nan,nan,nan,"  // NumSat,NumSatEx,HDOP,PDC1,PDC2,PDC3,PDC4, 
      "%7.2f,%7.2f,%7.2f,"    // StdPos[0],StdPos[1],StdPos[2] 
      "0,0,0,"       // StdVel[0],StdVel[1],StdVel[2], 
      "1,0,"        // TypePositioning[0],TechUsedPos, 
      "0,0,0,0,0,"      // Observables 
      "0,0,0,0,0,"      // Observables 
      "0,0,"        // VPL,VDOP 
      "0,"        // TechRec 
      "0,0,0,0,0,"      // Observables 
      "0,0,0,0,0\n",      // Observables 
      DateTime.c_str(), 
      X_CopySnapshot, Y_CopySnapshot, Z_CopySnapshot, 
      Vx_CopySnapshot, Vy_CopySnapshot, Vz_CopySnapshot,HPL_CopySnapshot, 
      HDOP_CopySnapshot, 
      StdPosX_CopySnapshot, StdPosY_CopySnapshot, StdPosZ_CopySnapshot); 
} 

2Gbを越えるとどのようにファイルを書き込むためのどのような方法があるかどうか私にはわかりません私はそれを達成すべきです。

ご協力いただきありがとうございます。

+5

32bit int issueのような音... Cでfwriteを使用すると[2GBのファイルサイズ制限がありますか?](http://stackoverflow.com/questions/730709/2gb-limit-on- file-size-when-fwrite-in-c) –

+1

どのOSを使用していますか? – alk

+0

ファイルサイズに2Gの制限があるファイルシステムを使用しているのでしょうか?脂肪? –

答えて

0

あなたはLinuxを使用することを国家として:男2オープン:

 
     O_LARGEFILE 
       (LFS) Allow files whose sizes cannot be represented in an off_t (but can be represented 
       in an off64_t) to be opened. The _LARGEFILE64_SOURCE macro must be defined (before 
       including any header files) in order to obtain this definition. Setting the _FILE_OFF- 
       SET_BITS feature test macro to 64 (rather than using O_LARGEFILE) is the preferred 
       method of accessing large files on 32-bit systems (see feature_test_macros(7)). 

そうでない場合は、ファイル操作はは2GiBに限定されています。

関連する問題