Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C:如何为输出创建可变数量的文件流?_C_Io - Fatal编程技术网

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

C:如何为输出创建可变数量的文件流?,c,io,C,Io,我是来自Python/Perl背景的C新手 我正在编写一个C程序,它将创建多个输出,输出的数量由输入描述文件确定(基本上,描述文件中的行数就是输出的数量),并且描述文件中的一个ID列将用作输出名称 我目前拥有的是,我将描述文件中的ID列读入一个数组,并使用ID的数量尝试打开相同数量的文件流 我很难让它工作。我现在有类似的东西,它在汇编时抱怨,在第82行和第84行有这样的信息: 错误:可变大小的对象可能未初始化 守则的一部分: 3 #include <stdio.h> 4 #inc

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

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

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

我很难让它工作。我现在有类似的东西,它在汇编时抱怨,在第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 }
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()
更干净、可读性更强。请让我知道为什么会有否决票……请让我知道为什么会有否决票。。。