使用fopen()时,stdin是不兼容的输入流;?

时间:2013-11-01 01:01:27

标签: c stream stdin fopen fgets

我有一些演示代码,希望用户输入文件名和模式。这本书暗示了可怕的gets();输入功能,我拒绝使用,所以我尝试用fgets()获取输入。当我使用fgets()时,我将输入流指定为'stdin',但代码不起作用。但是,代码将与gets()一起使用。我假设我的fgets()实现的问题是'stdin'流类型。这就是我的fgets()无法使用这个程序的原因吗?如果是这样,我应该使用什么输入流类型?这是程序:

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

int main(void)
{
    FILE *fp;
    char ch, filename[40], mode[4];

    while(1)
    {
        printf("\nEnter a filename: "); //This is where fgets/gets conflict is
        //fgets(filename, 30, stdin);     //I commented out the fgets()
        gets(filename);
        printf("\nEnter a mode (max 3 characters):");
        //fgets(mode, 4, stdin);                      //fgets again
        gets(mode);
        //Try to open the file
        if((fp = fopen(filename, mode)) != NULL)
        {
            printf("\nSuccessful opening %s in mode %s.\n",
                filename, mode);
            fclose(fp);
            puts("Enter x to exit, any other to continue.");
            if((ch = getc(stdin)) == 'x')
            {
                break;
            }else{
                continue;
            }
        }else
        {
            fprintf(stderr, "\nError opening file %s in mode %s.\n",
                filename, mode);
            puts("Enter x to exit, any other to try again.");
            if((ch = getc(stdin)) == 'x')
            {
                break;
            }else{
                continue;
            }
        }

}   
return 0;
}

先谢谢所有人。这个节目来自B. Jones的“21天教你自己”。

1 个答案:

答案 0 :(得分:4)

做得好,不想使用gets();这绝对是正确的方法。

打开文件的错误源于fgets()保留换行符而gets()没有。当您尝试使用换行符打开文件名时,找不到该文件。