我是来自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流并使其工作?有关修改某些线条的方法的任何建议也欢迎!
答案 0 :(得分:2)
将循环外的fo_i1
和fo_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
。
可能还有其他问题。