[英]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;
}
它没有循环,它正在等待输入。 您已请求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
失败,如果无法打开任何一个文件,则会导致未定义的行为。
ch
的char
类型太小,无法容纳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.