2012-03-15 11 views
1

私はCでテキストファイルにアクセスして、さらなる計算のためのプロトタイプ関数を得るプログラムを書いています。このようなファイルに格納されるデータの簡単な例を次に示します。ファイルから可変長配列を読み取る

slc 0.5 0.5;

rdf 1.04 1.5 3.4 0.4;

raq 0 0.2 0.44;

jqw7.23 6.20.23 1.56 1.345 1.0;

まず、配列の内容を定義する "slc"または "jqw"という行の一意のIDが渡されます。これがこの文字の唯一の目的です。

悪い点は、すべての配列の長さが異なることです(2つの要素から60まで)。私はラインのID(すなわち "slc")だけを入力し、このラインのすべての数字を配列に入れたいと思います。

この問題を解決するための戦略についてお聞きしたいと思います。本当にコードは必要なく、効果的な戦略だけです。私にとって、別の解決方法は、IDごとに既知のオフセットと配列の長さを使用することですが、これはtxtファイルの編集を複雑にする(つまり新しい行を挿入する)ため、最良の解決策ではありません。

ありがとうございました!

答えて

0

60の配列を作成します(あなたの言うとおり)。それを埋めると、そのバケットがどのくらい満たされているかをメモしてください。メモリが不安な場合は、適切なサイズにコピーしてください(malloc)。それ以外の場合は、その特定の行の配列に数値を指定した60個のfloat/doubleを格納します。

+0

お返事ありがとうございます!試してみるよ。 – Cecil

0

一般に、scanfバージョンを使用すると、これらの種類のもので遊ぶことができます。特に、例のこれらのタイプでは、など私たちは多くのことを考える必要があると我々はsscanfの効率的な使用を行う必要があり、fscanffprintfsprintf ...

Particulary、私はこの質問と興味を持って、私を書きました自分のプログラム。

私はここで参考にしています。 ただ.....すべてのベスト

#include<stdio.h> 
int main(){ 
     FILE* fp = fopen("D:\\LangFiles\\CFiles\\Stackoverflow answers try\\numread.txt","r"); 
     char a[] = "jqw"; 
     char digits[50],str[5];  

     if(!fp) 
     printf("Reporting error"); 


     while(!feof(fp)){ 
      fscanf(fp,"%s %[^;] %*c",str,digits); //reading the jqw in str and rest in digits and ignoring the ; at the last 

      if(strcmp(str,a) == 0){   
       while(1){ 
        float float_num; 
        sscanf(digits,"%f",&float_num); //reading a single digit 
        printf("%f\t",float_num); 
         /*Store or use float_num*/                
        if(strchr(digits,' '))   //moving the digits ptr to next space        strcpy(digits , strchr(digits,' ')+1); //making digits ptr to point the next char of space 
        else 
         break; //exiting once the digits is empty 
       } 

       break; //moving out after our requirement is satisfied 
      } 

     }  
getchar();   
} 

...あなたの目標を達成するために、I/O機能で遊んで

+0

このようなfeof()を使わないでください(** EOFがヒットした後、!= 0 **が返されます)。代わりに、fscanf()からの戻り値を確認してください。少なくとも。 fgets()の周りにループを構築することは、より良い(より安全で簡単な)ことです。 – wildplasser

0

を開始fgets()との完全なラインを読みます。

はエラーをチェックするために、両方の第二引数を使用して確認してstrtod()(またはstrtol()またはstrtoul())と行から番号を取得してください(および/または;ライン終端用?)と読書の番号を継続します。

配列に関しては、 "十分に大きい"チャンク(60要素?)を割り当てるか、必要に応じてそれを拡張します。

関連する問題