繁体   English   中英

将一个文件复制到另一个文件:scanf 不断循环

[英]Copying one file to another: scanf keeps looping

我正在创建一个程序,它采用两个命令行 arguments:第一行参数是要复制的文件的名称,第二个是新文件。 如果缺少第二个参数,则将文件复制到标准输出。 如果 arguments 都丢失了,程序应该从 stdin 读取并打印到 stdout 即。 ./a.out 输入.txt output.txt

我做了以下操作,但我遇到了一个问题,即 scanf 不断循环并且不退出:

int main(int argc, char *argv[]) `
{
    char text[10];
    FILE *input;
    FILE *output;
    char ch;

    printf("%s", argv[0]);
    if (argc == 3)
    {
        input = fopen(argv[1], "r");
        output = fopen(argv[2], "w");

        while ((ch = fgetc(input)) != EOF)
        {
            fputc(ch, output);
            ch = fgetc(output);
        }
    }

    if (argc == 2)
    {
        input = fopen(argv[1], "r");

        while ((ch = fgetc(input)) != EOF)
        {
            printf("%c", ch);
        }

        printf("\n");
    }

    if (argc == 1)
    {
        scanf("%c", text);
        // here it keeps looping
    }
    fclose(input);

    return 0;
}

在返回之前进行一些输入后,在行尾显示 cursor 的屏幕截图

它没有循环,它正在等待输入。 您已请求scanf("%c")一个字符,但在您按下enter之前scanf不会继续。 我想你的意思是scanf("%s")getch() ,但不清楚。

它会在下一行抛出错误,因为fclose()正在关闭一个在只有 1 个参数的情况下未初始化的FILE*

在缺少参数的情况下,您可能会修改此家庭作业示例以在STDIN/STDOUT上使用fopen() ,这样您就不会编写冗余代码。

您的代码中存在多个问题:

  • 你 output argv[0]stdout :如果argc < 3 ,你应该复制到stdout ,这个额外的 output 正在破坏 output。你可以改为 output 到stderr或完全删除此行。

  • 您不检查fopen失败,如果无法打开任何一个文件,则会导致未定义的行为。

  • chchar类型太小,无法容纳fgetc()的所有返回值。 在具有 8 位字节的机器上, fgetc()有 257 个可能的返回值,您必须将ch设为int以可靠地将EOF与所有其他返回值区分开来。

  • fgetc() / fputc()循环中,您在循环的每次迭代中读取 2 个字节,但只写入一个字节。

  • 最后一种情况下的scanf()只是在等待输入,因为您应该从stdin复制到stdout ,但是一旦您按下Enter键,程序就会停止。 您应该对所有复制循环使用相同的fgetc() / fputc()循环。

  • 你应该包括<stdio.h>

这是修改后的版本:

int main(int argc, char *argv[]) {
    FILE *input = stdin;
    FILE *output = stdout;
    int ch;

    if (argc > 1) {
        input = fopen(argv[1], "r");
        if (input == NULL) {
            fprintf("cannot open input file %s\n", argv[1]);
            return 1;
        }
    }
    if (argc > 2) {
        output = fopen(argv[2], "w");
        if (output == NULL) {
            fprintf("cannot open output file %s\n", argv[2]);
            return 1;
        }
    }
    while ((ch = fgetc(input)) != EOF) {
        fputc(ch, output);
    }
    if (argc > 2) {
        fclose(output);
    }
    if (argc > 1) {
        fclose(input);
    }
    return 0;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM