在C中读取和写入字节(从/文件中)

时间:2013-04-21 19:35:23

标签: c file input byte output

我必须在 C 中解决操作系统类的以下问题:

在命令行中给出三个文件,两个用于输入,一个用于输出。 输出文件从输入文件中获取,如下所示:10个字节 第一个文件,第二个文件的20个字节,接下来的10个字节 第一个文件,从第二个文件接下来的20个字节,依此类推,直到 输入文件已完成。

简单但效率低下的解决方案:读取和写入10/20字节的组。 一种有效(但不简单)的解决方案:读写块 5000字节。

我试过这个简单的解决方案。但它不起作用......任何人都可以帮助我吗?

#include<stdio.h>

int main(int argc, char* argv[], char* envp[]){
if (argc != 4){
    printf("%s", "Usage: c4h filename\n");
    return 0;
}

int c1,c2,i;
FILE *in1;
FILE *in2;
FILE *out;

in1 = fopen(argv[1], "r");
in2 = fopen(argv[2], "r");
out = fopen(argw[3], "wb");


if (in1 == NULL){
    printf("%s", "File not found!\n");
    return 0;
}

if (in2 == NULL){
    printf("%s", "File not found!\n");
    return 0;
}

while(feof(in1)!=0 && feof(in2)!=0){
    for(int i=0;i<20;i++)
        if(feof(in1)!=0){
            c1 = fgetc(in1);
            fputc(c1,out);
        }

    for(int i=0;i<10;i++){
        if(feof(in2)!=0){
            c2 = fgetc(in2);
            fputc(c2,out);
        }

}

fclose(in1);
fclose(in2);
fclose(out);
return 0;
}

1 个答案:

答案 0 :(得分:1)

您的代码存在三个问题:

  1. 使用argw代替argv
  2. 的错字
  3. 缺少关闭while循环}
  4. 当你在eof时,
  5. feof(file)!=0评估为true,与你想要的条件完全相反,只有在你不在eof时才用!eof(file)替换为{true}
  6. 还有一个小问题,你在for循环中重新定义变量ifor(int i=0;i<10;i++)应该是for(i=0;i<10;i++),因为你在代码中先前定义了i

    您应该尝试编译代码,然后再将其转换为SO!您发布的代码甚至没有为我编译。这是工作代码:

    #include<stdio.h>
    
    int main(int argc, char* argv[], char* envp[]){
    if (argc != 4){
        printf("%s", "Usage: c4h filename\n");
        return 0;
    }
    
    int c1,c2,i;
    FILE *in1;
    FILE *in2;
    FILE *out;
    
    in1 = fopen(argv[1], "r");
    in2 = fopen(argv[2], "r");
    out = fopen(argv[3], "wb");
    
    
    if (in1 == NULL){
        printf("%s", "File not found!\n");
        return 0;
    }
    
    if (in2 == NULL){
        printf("%s", "File not found!\n");
        return 0;
    }
    
    while(!feof(in1) && !feof(in2)){
        for(i=0;i<20;i++)
            if(!feof(in1)){
                c1 = fgetc(in1);
                fputc(c1,out);
            }
    
        for(i=0;i<10;i++){
            if(!feof(in2)){
                c2 = fgetc(in2);
                fputc(c2,out);
            }
    
            }
    }
    
    fclose(in1);
    fclose(in2);
    fclose(out);
    return 0;
    };