我创建了一个名为input.txt的文本文件,内容简单 - 3后跟回车。
然后我使用下面的源代码构建一个可执行文件scanf_test.exe。
#include <stdio.h> /* scanf, printf */
/* input.txt file has contents "3" followed by carriage return */
int main(int argc, char* argv[]) {
int n;
printf("cmdline argc: %d\n", argc);
if(argc < 2)
return -1;
/* check we set cmd line ok */
printf("cmdline argv[1]: %s\n", argv[1]);
/* unfortunately freezes on this line in debugging mode (F5) or skips past in normal run mode (Ctrl F5)
Evben if I run from cmd line with eg scanf_test.exe <input.txt just returns printing nothing. */
scanf("%d\n", &n);
printf("n=%d", n);
return 0;
}
然后我在命令行上运行:
C:\test\Debug>scanf_test.exe <input.txt
cmdline argc: 1
然后程序只运行并返回,但似乎没有从stdin获取数字3?
C:\test\Debug>scanf_test.exe qqq
cmdline argc: 2
cmdline argv[1]: qqq
第二个例子是传递一个无意义的参数 - 但它至少会识别传递的参数。
我以为
<input.txt
会打开文件并输入内容。我做错了什么?
答案 0 :(得分:1)
如果你只想从input.txt读取一个数字,你可以在scanf之前使用freopen(“input.txt”,“r”,stdin),喜欢这个:
#include <stdio.h>
int main(int argc, char* argv[])
{
int n;
freopen("input.txt", "r", stdin);
scanf("%d", &n);
printf("n=%d", n);
return 0;
}
如果要从命令行传递文件名:
#include <stdio.h>
int main(int argc, char* argv[])
{
int n;
if (argc != 2)
{
/*printf something here*/
return 0;
}
freopen(argv[1], "r", stdin);
scanf("%d", &n);
printf("n=%d", n);
return 0;
}
或者,如果你想这样使用这个程序:
scanf_test < input.txt
你应该写代码:
#include <stdio.h>
int main(int argc, char* argv[])
{
int n;
scanf("%d", &n);
printf("n=%d", n);
return 0;
}
它运作正常。
请记住,不要在scanf中的格式字符串末尾写'\ n'。 scanf不是printf!