在VS2008中使用scanf从重定向文件中读取

时间:2013-12-15 12:04:14

标签: c file-io stdin

我创建了一个名为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

会打开文件并输入内容。我做错了什么?

1 个答案:

答案 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!