2017-02-09 7 views
0

私はPython/Perlのバックグラウンドから来たCが新です。C:出力のためにFILEストリームの可変数を作成する方法は?

私は、複数の出力を作成し、出力の数は入力記述ファイル(基本的に記述ファイル内の行数は出力数です)から決定します。記述ファイルが出力名として使用されます。

私が現在持っているのは、記述ファイルのID列を配列に読み込み、ID番号を使用して同じ数のFILEストリームを開こうとすることです。

この問題を解決するには問題があります。私は、可変サイズの周りに得ることができますどのように

3 #include <stdio.h> 
4 #include <time.h> 
5 #include <zlib.h> 
6 #include <string.h> 
.... 
50 gzFile fi2,fi1,fr1; 
51 
52 fi2 = strcmp(argv[1],"-")? gzopen(argv[1],"r"):gzdopen(fileno(stdin),"r"); 
53 fi1 = strcmp(argv[2],"-")? gzopen(argv[2],"r"):gzdopen(fileno(stdin),"r"); 
54 FILE *samplelist = fopen(argv[5],"r"); 
55 fr1 = strcmp(argv[6],"-")? gzopen(argv[6],"r"):gzdopen(fileno(stdin),"r"); 
56 if (fi2 ==0 || fi1 ==0 || samplelist == 0 || fr1 == 0) { 
57  fprintf(stderr,"[E:%s] failed to open the input file/stream.\n",__func__); 
58  return 1; 
59 } 
60 
61 char line[100]; 
62 char indexseq[10]; 
63 char sampleid[5]; 
64 char genome[15]; 
65 char seqmode[3]; 
66 char indexes[10][BUFSIZ]; 
67 int lidx = 0; 
68 while (fgets(line, sizeof(line),samplelist)) { 
69  //printf("%s",line); 
70  sscanf(line,"%s\t%s\t%s\t%s\n",indexseq,sampleid,genome,seqmode); 
71  //printf("%s\n",indexseq); 
72  //printf("%s\n",sampleid); 
73  strcpy(indexes[lidx],sampleid); 
74  ++lidx; 
75  strcpy(indexes[lidx],indexseq); 
76  ++lidx; 
77 } 
78 char buf[30] = ""; 
79 int i; 
80 for (i = 0; i <lidx; i+=2) { 
81  snprintf(buf, sizeof buf, "%s%s%s%s", argv[3],"_I1_",indexes[i],".fastq"); 
82  fo_i1[i] = fopen(buf,"w"); 
83  snprintf(buf, sizeof buf, "%s%s%s%s", argv[3],"_R1_",indexes[i],".fastq"); 
84  fo_r1[i] = fopen(buf,"w");      
85 } 

:コードの一部を

error: variable-sized object may not be initialized

:私は今、この権利のようなものを持っており、それはライン82と84のメッセージを表示して、コンパイル時に文句を言いますFILEストリームを取得して動作させますか?特定の行を変更する方法に関する提案も歓迎します!

+0

なぜ私は下の投票があることをお知らせください... – olala

答えて

2

ループ外のfo_i1およびfo_r1FILE *fo_i1[lidx]; FILE *fo_r1[lidx];として宣言し、FILE *部分のないループ内で使用します。

FILE *fo_i1[lidx]; 
FILE *fo_r1[lidx]; 
for (i = 0; i < lidx; i+=2) { 
    fo_i1[i] = fopen(concat(concat(concat(argv[3],"_I1_"),indexes[lidx]),"_fastq"),"w"); 
    fo_r1[i] = fopen(concat(concat(concat(argv[3],"_R1_"),indexes[lidx]),"_fastq"),"w"); 
} 

ただし、i+=2ロジックが間違っているように見えます。 2つの別々の配列があります。だからおそらくあなたはそれがi++であることを望んでいるでしょう。

もう1つの問題はindexes[lidx]です。 lidxindexes配列のエントリ数の値を持つためです。つまり、lidxは配列の無効なインデックスです - 最後に有効なインデックスはlidx-1です。

その他の問題が考えられます。

+0

クイックフィードバックありがとう!出来た!私は配列に1行の2列を読み込み、各IDを1回だけ取る必要があるので、基本的に別の列をスキップする必要があるので、i + = 2は正しいです。 – olala

+0

'... concat(argv [3]、" _ I1_ " )... 'プリッツァー賞に勝てない... – wildplasser

+0

@olalaいいえ、それはまだ正しく見えません。これは、あなたの 'fo_'配列に"穴 "があることを意味します。例えば、 'fo_i1 [1]'と 'fo_r [1]'は設定されません。それは本当にあなたが望むものですか? – kaylum

関連する問題