从C中读取文件后从stdin中获取垃圾字符

时间:2013-10-04 04:51:25

标签: c file-io stdin scanf

从控制台成功读取重定向文件到我的程序后,我要求用户输入一个单词,然后使用scanf()读取单词。

我遇到的问题是scanf()立即读取垃圾字符,然后程序继续。它甚至没有暂停让用户在控制台中输入任何内容。当我不打开文件时不会发生这种情况。其他一切都很完美。可能是什么问题:

**我尝试了所有建议,仍然无法让它发挥作用。我已经制作了一个新项目,只是为了让这部分工作,现在就是这样。忽略scanf只寻找单个字符,即使我要求一个字。我这样做只是为了看程序是否会实际暂停并允许我输入内容,但事实并非如此。只需输入一些垃圾和程序结束。

 main(){

       int n,i;
       char ch;
       char line[80];

       while(fgets(line, 80, stdin) != NULL){
         for(i=0;i<80;i++){
            ch=line[i];
            if(ch=='\n'){
                printf("%c",ch);
                break;
            }
            else{
                    printf("%c",ch);
            }
         }
       }
       printf("Please enter a word: ");
       scanf("%c",&ch);
    }

2 个答案:

答案 0 :(得分:2)

您无法从文件中重定向stdin,也可以使用键盘输入(我知道)。如果你想这样做,让程序将输入文件作为命令行参数然后像下面那样运行它是更简单的:prog myfile.txt。另外,给自己留一个带有fgets()的填充 - 使用比maxlen分配的数组少一个。如果最大长度不包括'\ 0'终止字符,C char数组最常使用一个小于分配长度的数据来处理需要最大长度的任何内容。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc,char *argv[])

       {
       FILE *f;
       int i;
       char line[80];

       if (argc<2)
           {
           printf("Usage:  %s <inputfile>\n",argv[0]);
           exit(10);
           }
       /* Open file and echo to stdout */
       f=fopen(argv[1],"r");
       if (f==NULL)
           {
           printf("Cannot open file %s for input.\n",argv[1]);
           exit(20);
           }
       while (fgets(line, 79, f) != NULL)
           printf("%s",line);
       fclose(f);

       /* Get user input from stdin */
       printf("Please enter a word: ");
       if (fgets(line,79,stdin)==NULL)
           {
           printf("Nothing entered.  Program aborted.\n");
           exit(30);
           }
       /* Remove CR/LF from end of line */
       for (i=strlen(line)-1;i>=0 && (line[i]=='\n' || line[i]=='\r');i--)
           ;
       line[i+1]='\0';
       printf("The word entered is: '%s'\n",line);
       return(0);
       }

答案 1 :(得分:0)

sscanf用于从流或缓冲区输入,并且在unix中,stdin被视为文件,所以你应该使用fscanf从文件输入,所以使用fscanf(stdin,“%s”,testword); < / p>