【问题标题】:Read and write bytes in C (from/in file)在 C 中读取和写入字节(从/在文件中)
【发布时间】:2013-04-21 19:35:23
【问题描述】:

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

在命令行给出三个文件,两个用于输入,一个用于输出。 输出文件是从输入文件中得到的,如下: 10 bytes from 第一个文件,第二个文件的 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;
}

【问题讨论】:

  • 你试过了吗?
  • 您是否尝试过任何一种解决方案?您是否需要对其进行优化,或者低效的解决方案是否足够?
  • 我将从三个 FILE 指针和一个循环开始。除此之外,没有太多可评论的,因为您没有提供包含更具体问题的代码。
  • 低效的解决方案应该足够了。我阅读并试图理解一些 C 教程,但我仍然不知道如何解决这个问题
  • 肯定首先采用更简单的“低效”解决方案。由于操作系统和/或硬件的缓存,它不会像您想象的那么大。

标签: c file input byte output


【解决方案1】:

您的代码存在三个问题:

  1. argw 代替argv 拼写错误
  2. while 循环缺少关闭 }
  3. feof(file)!=0 在您处于 eof 时评估为 true,与您想要的条件完全相反,替换为 !eof(file),仅当您不在 eof 时才评估为 true

还有一个较小的问题,您在 for 循环中重新定义变量 ifor(int i=0;i&lt;10;i++) 应该是 for(i=0;i&lt;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;
};

【讨论】:

  • 谢谢!非常感谢您的帮助。
  • 很高兴为您提供帮助,如果此答案解决了您的问题,请通过“接受”它(按旁边的绿色复选标记)来帮大家一个忙
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-16
  • 2020-09-17
  • 2020-05-23
  • 2012-10-23
  • 1970-01-01
相关资源
最近更新 更多