C:文件重定向不起作用

时间:2015-12-16 23:26:05

标签: c file printf scanf

我想在下面的C程序中做一个简单的scanfprintf

  1. 获取用户输入
  2. 检查用户输入是否正确,如果是,则将其打印出来,否则显示错误消息
  3. 以下是代码:

    #include <stdio.h>
    
    int main() {  
        int latitude;
        int scanfout;
        int started = 1;
    
        puts("enter the value:");
    
        while (started == 1) {
            scanfout = scanf("%d", &latitude);
            if (scanfout == 1) {
                printf("%d\n", latitude);
                printf("ok return code:%d\n", scanfout);
                puts("\n");
            } else {
                puts("value not a valid one");
                printf("not ok return code:%d\n", scanfout);        
            }
            fflush(stdin);
        }
        return 0;
    }
    

    尝试在命令终端编译并运行它,程序正常工作。  命令行输出:

    enter the value:
    1
    1
    ok returncode:1
    
    0
    0
    ok returncode:1
    
    122.22
    122
    ok returncode:1
    
    sad
    value not a valid one
    not ok returncode:0
    

    正如您所看到的,程序只是扫描用户输入并打印出来,它在命令行中运行正常,但是当它尝试将输入重定向到文本文件时说:

    test < in.txt
    

    程序不起作用,else部分的print语句继续以无限循环打印。文本文件in.txt包含单个值12,而不是打印12,程序只是进入无限循环并打印:

    value not a valid one
    not ok returncode:0
    value not a valid one
    not ok returncode:0
    value not a valid one
    not ok returncode:0
    value not a valid one
    not ok returncode:0
    

    任何人都可以帮我吗?代码是否正确,为什么它从命令行工作以及为什么文件重定向不起作用?帮助将不胜感激...

1 个答案:

答案 0 :(得分:0)

您不测试文件结尾:当扫描输入文件时,程序进入无限循环,因为scanf返回-1,程序会抱怨并重试。

顺便说一句,如果输入文件中的数据无法转换为int,程序将永远循环,试图徒劳地重新分析相同的输入。

请注意,C标准中未指定fflush(stdin);,它可能会或可能不会按预期执行,尤其是从文件中。

以下是更正后的版本:

#include <stdio.h>

int main() {  
    int latitude, scanfout, c;

    puts("enter the value:");

    for (;;) {
        scanfout = scanf("%d", &latitude);
        if (scanfout == 1) {
            printf("%d\n", latitude);
            printf("ok return code:%d\n", scanfout);
            puts("\n");
        } else
        if (scanfout < 0) {
            break;   // End of file 
        } else {
            puts("value not a valid one");
            printf("not ok return code:%d\n", scanfout);        
        }
        /* read and ignore the rest of the line */
        while ((c = getchar()) != EOF && c != '\n')
            continue;
    }
    return 0;
}