c - C:即使输入文件作为参数给出,程序也会要求用户输入
问题描述
我的程序需要接受一个文件输入,如果没有给出,它需要将用户输入视为它的输入。
当我像这样将输入文件输入程序时:
./sim < ex1_in
一切正常!
但是,当我将输入文件指定为文件参数时,如下所示:
./sim ex1_in
程序改为寻找用户输入。
这是处理输入和文件参数的代码部分:
int main(int argc, char * argv []) {
if (argc > 3) {
fprintf (stderr, "Error: Too many arguments.\n");
return 1;
}
FILE *fp = argc > 1 ? fopen (argv[1], "r") : stdin;
if (!fp) { /* check file */
fprintf (stderr, "Error: File Open Failed '%s'.\n", argv[1]);
return 2;
}
//Initializing array of 256 unsigned chars
unsigned char binary[256];
int i = 0;
unsigned char c;
int count2 = 0;
//populate the 256 byte char array from stdin
while (count2 < SIZE) {
c=getchar();
binary[i] = c;
i++;
count2++;
}
到目前为止,我已将此while
循环确定为问题区域,因为当我将其注释掉时,不会发生不需要的行为。但我不确定为什么会这样。
稍后在该main
方法中,文件被关闭:
if (fp != stdin) fclose (fp); /* close file if not stdin */
另一个相关的事情:
#define SIZE 256
解决方案
getchar()
从 读取stdin
,但您必须从fp
. 更改getchar()
为getc(fp)
。
getchar()
基本上只是getc(stdin)
.
另一种方法是连接stdin
到文件,而不是使用另一个变量。
if (argc > 1) {
freopen(argv[1], "r", stdin);
}
推荐阅读
- checkbox - 复选框选定的项目不更新数据库
- linux - BitBucket 服务器 Ctrl M 字符删除
- c# - OneWayToSource 在 Xamarin 中与 C# 绑定
- postgresql - 在 PostgreSQL 中创建无界子分区时出错
- java - 为什么eclipse swt浏览器不集中?
- c++ - 我需要更好地理解 for 循环
- apache-kafka-streams - kafka 流如何尝试为每个 kafka 主题获取相同的分区?
- flask - Google Cloud Webapp 使用用户上传的文件进行处理
- javascript - Palindrome Index-Hackerrank 的优化代码解决方案
- javafx - GraalVM javafx.fxml.LoadException:解析 onAction='#loginAction' 时出错,或者事件处理程序不在命名空间中