2011-03-11 25 views
0

私は列の形式で約300個の数値(浮動小数点、負の陽性)を含むファイルnumbers.datを持っています。目的はまずnumbers.datに300個の数字を入力し、毎回100個の数字を別のファイル、例えばn1.datに抽出することです。 2番目のファイルn2.datは、numbers.datから取得したファイルの3つのサブセットについて、numbers.datから次の100個の番号を取得します。最後に読み込まれた100番目の番号の場所がどのように考慮されるのか理解できず、次のブロックのファイルの読み込みと取り出しは、previosが取り出した番号の後に行われます。Cのテキストファイルから数値のブロックを読み取る方法

ガンナーが提供するソリューション試す:

FILE *fp = fopen("numbers.dat","r"); 
FILE *outFile1,*outFile2,*outFile3; 
int index=100; 

char anum[100]; 
while(fscanf(fp,"%s",anum) == 1) 
    { 
if(index==100) 
    { 
// select proper output file based on index. 
fprintf(outFile1,"%s",anum); 
    index++; } 
    if(index >101) 
    { 
     fprintf(outFile2,"%s",anum); 
    index++; } 
} 

を、問題が一つだけのデータが書き込まれているです。正しいプロセスは何でしょうか?

+0

、たとえば、ファイル '番号を投稿してください.dat、n1.dat、n2.dat、n3.dat'。 300サンプルの代わりに15サンプルを使用すれば十分です。 –

+0

@eznme:提供されたコードは@Gunnerによって甘受されています。ここで、outFile1はn1.dat、outFile2はn2.dat、outFile3はn3.datです。私はこの記法に固執して、そうした答えに関連しやすくしました。この問題は、outFile1とoutFile2に100個の数字の代わりに1個の数字が入っていることです。インデックスが曖昧であり、ループが機能していません。また、オープンとクローズのような通常の予備ファイル操作は実行されていますが、上記には含まれていないことに注意してください。 – SKM

答えて

1

私は

 
read data from input file line-by-line 
keep a line count 
based on the current line count copy the line to a specific output file 

ように、そのためのプログラムを記述します。この変換の言葉による説明が十分に正確ではありません。この

のようなもの
#include <stdio.h> 
#include <stdlib.h> 

#define INPUTFILENAME "numbers.dat" 
#define MAXLINELEN 1000 
#define NFILES 3 
#define LINESPERFILE 100 
#define OUTPUTFILENAMETEMPLATE "n%d.dat" /* n1.dat, n2.dat, ... */ 

int main(void) { 
    FILE *in, *out = NULL; 
    char line[MAXLINELEN]; 
    int linecount = 0; 

    in = fopen(INPUTFILENAME, "r"); 
    if (!in) { perror("open input file"); exit(EXIT_FAILURE); } 
    do { 
     if (fgets(line, sizeof line, in)) { 
      if (linecount % LINESPERFILE == 0) { 
       char outname[100]; 
       if (out) fclose(out); 
       sprintf(outname, OUTPUTFILENAMETEMPLATE, 1 + linecount/LINESPERFILE); 
       out = fopen(outname, "w"); 
       if (!out) { perror("create output file"); exit(EXIT_FAILURE); } 
      } 
      fputs(line, out); 
      linecount++; 
     } else break; 
    } while (linecount < NFILES * LINESPERFILE); 
    fclose(in); 
    if (out) fclose(out); 
    return 0; 
} 
1

number.datから読み込み、読み込まれた現在の番号のインデックスに基づいて対応する出力ファイルに書き込みます。

サンプルコード。

FILE *fp = fopen("numbers.dat","r"); 
FILE *outFile; 
int index=0; 
char anum[100]; // since we are not calculating, we can store numbers as string 
while(fscanf(fp,"%s",anum) == 1) 
{ 
// select proper output file based on index. 
fprintf(outFile,"%s",anum); 
index++; 
} 
+0

は、コードスニペット、複数のforループを扱う方法、freadまたはfscanfなどを使用する場合の説明方法があれば、非常に義務づけられます。また、ファイルには列形式の数字が配列されています – SKM

+0

編集質問を参照してください。提案。しかし、混乱はまだ残っています>>最初のwhileループが存在すると、2番目のプログラムループがどのように開始し、2番目のwhileループ内のインデックスに言及していないので、最後のインデックスが保存されます。 – SKM

+0

ただ1つのループがあります。ここでは、2番目のループを取得します。 –

関連する問題