C:如何为输出创建可变数量的文件流?
我是来自Python/Perl背景的C新手 我正在编写一个C程序,它将创建多个输出,输出的数量由输入描述文件确定(基本上,描述文件中的行数就是输出的数量),并且描述文件中的一个ID列将用作输出名称 我目前拥有的是,我将描述文件中的ID列读入一个数组,并使用ID的数量尝试打开相同数量的文件流 我很难让它工作。我现在有类似的东西,它在汇编时抱怨,在第82行和第84行有这样的信息: 错误:可变大小的对象可能未初始化 守则的一部分:C:如何为输出创建可变数量的文件流?,c,io,C,Io,我是来自Python/Perl背景的C新手 我正在编写一个C程序,它将创建多个输出,输出的数量由输入描述文件确定(基本上,描述文件中的行数就是输出的数量),并且描述文件中的一个ID列将用作输出名称 我目前拥有的是,我将描述文件中的ID列读入一个数组,并使用ID的数量尝试打开相同数量的文件流 我很难让它工作。我现在有类似的东西,它在汇编时抱怨,在第82行和第84行有这样的信息: 错误:可变大小的对象可能未初始化 守则的一部分: 3 #include <stdio.h> 4 #inc
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 }
3#包括
4#包括
5#包括
6#包括
....
50 GZ文件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文件*samplelist=fopen(argv[5],“r”);
55 fr1=strcmp(argv[6],“-”?gzopen(argv[6],“r”):gzdopen(fileno(stdin),“r”);
56如果(fi2==0 | | fi1==0 | |样本列表==0 | | fr1==0){
57 fprintf(stderr,“[E:%s]无法打开输入文件/流。\n”,\uuu func\uuu);
58返回1;
59 }
60
61个字符行[100];
62个字符索引[10];
63个字符样本[5];
64个字符的基因组[15];
65字符序列模式[3];
66个字符索引[10][BUFSIZ];
67 int lidx=0;
68 while(fgets(line,sizeof(line),samplelist)){
69//printf(“%s”,行);
70 sscanf(行,“%s\t%s\t%s\t%s\n”,indexseq,样本ID,基因组,seqmode);
71//printf(“%s\n”,indexseq);
72//printf(“%s\n”,样本ID);
73 strcpy(索引[lidx],样本ID);
74++lidx;
75 strcpy(指数[lidx],指数seq);
76++lidx;
77 }
78个字符buf[30]=“”;
79 int i;
80对于(i=0;i将fou i1
和fou r1
在循环外声明为:FILE*fou i1[lidx];FILE*fou 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");
}
文件*fo_i1[lidx];
文件*fo_r1[lidx];
对于(i=0;i
但是请注意,您的i++=2
逻辑看起来是错误的。有两个独立的数组。因此,您可能真的希望它是i++
另一个问题是indexes[lidx]
。因为lidx
具有indexes
数组中条目数的值。这意味着lidx
是数组的无效索引-最后一个有效索引是lidx-1
可能还有其他问题。在循环外声明fo_i1
和fo_r1
为:文件*fo_i1[lidx];文件*fou r1[lidx];
并在循环内使用它,而不使用文件*
部分
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");
}
文件*fo_i1[lidx];
文件*fo_r1[lidx];
对于(i=0;i
但是请注意,您的i++=2
逻辑看起来是错误的。有两个独立的数组。因此,您可能真的希望它是i++
另一个问题是indexes[lidx]
。因为lidx
具有indexes
数组中条目数的值。这意味着lidx
是数组的无效索引-最后一个有效索引是lidx-1
可能还有其他问题。感谢您的快速反馈!它成功了!i+=2是正确的,因为我正在从数组中的一行读取两列,每个ID只需获取一次,因此基本上我需要跳过另一列column@olala不,看起来还是不对。这意味着你会有“洞”在fou
数组中。例如,fou i1[1]
和fou r[1]
不会被设置。这真的是你想要的吗?我明白你的意思,也许我应该使用lidx/2
作为fo
数组的大小?@wildplasser我从这里得到了答案:,你知道更好的方法吗?我可以在Python中使用“+”来连接字符串,我想知道如何在CIt中实现这一点很糟糕。(它甚至会泄漏内存)只需使用snprintf()
更干净、可读性更强。感谢您的快速反馈!它起作用了!i+=2是正确的,因为我正在从数组的一行读取两列,并且只需要获取每个ID一次,所以基本上我需要跳过另一列column@olala不,看起来还是不对。这意味着你会你的fou
数组中的“洞”。例如,fou i1[1]
和fou r[1]
不会被设置。这真的是你想要的吗?我明白你的意思,也许我应该使用lidx/2
作为fo
数组的大小?@wildplasser我从这里得到了答案:,你知道更好的方法吗?我可以在Python中使用“+”来连接字符串,我想知道如何在CIt中实现这一点很糟糕。(它甚至会泄漏内存)只需使用snprintf()
更干净、可读性更强。请让我知道为什么会有否决票……请让我知道为什么会有否决票。。。