C:如何为输出创建可变数量的FILE流?

时间:2017-02-09 19:35:47

标签: c io

我是来自Python / Perl背景的C新手。

我正在编写一个C程序,它将创建多个输出,输出数量由输入描述文件确定(基本上描述文件中的行数是输出数)和一个ID列描述文件将用作输出名称。

我目前所拥有的是我将描述文件中的ID列读入数组并使用ID数来尝试打开相同数量的FILE流。

我无法让它发挥作用。我现在有类似的东西,它在第82和84行的消息编辑时抱怨:

  

错误:可能无法初始化可变大小的对象

部分代码:

 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 }

我如何绕过可变大小的FILE流并使其工作?有关修改某些线条的方法的任何建议也欢迎!

1 个答案:

答案 0 :(得分:2)

将循环外的fo_i1fo_r1声明为:FILE *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逻辑看起来不对。有两个单独的数组。所以你可能真的想要i++

另一个问题是indexes[lidx]。因为lidx具有indexes数组中条目数的值。这意味着lidx是数组的无效索引 - 最后一个有效索引是lidx-1

可能还有其他问题。