c - fopen 语句中的文件名

标签 c

程序将询问您要打开的文件的文件名。然后内容将显示在屏幕上。这是我到目前为止所得到的,我知道这是错误的。我保存在变量filename中的应该是fopen语句中的文件名。

#include<stdio.h>

main()
{
    FILE *fp;
    char filename[20];
    char c;

    clrscr();

    printf("ENTER FILE NAME: ");
    scanf("%s",&filename);

    while(!feof(fp))
    {
        fgetc(fp=fopen("filename","r"));

        while(!feof(fp))
        {
            fscanf(fp,"%c",&c);
            printf("%c",c);
        }
    }
    fclose(fp);
    getch();
}

我存储在变量文件名中的方法/函数是否会出现在 fopen 语句中?我知道这个程序中缺少一些东西。如果您能在这方面帮助我,我将不胜感激。

最佳答案

首先,这个说法是错误的:

scanf("%s",&filename);

你正在做的是传递一个 char **(技术上,一个 char (*)[20])到 scanf,但是相反,您只需要一个 char *,这样您就可以去掉 &,如下所示:

scanf("%s", filename);

另请注意,scanf 无法知道 filename 有多大(在本例中,只有 20 个字符),因此如果您输入太大的文件名,您的程序将崩溃(或更糟)。此外,如果文件名中有任何空格,您将只能获得文件名的第一部分。相反,您可以像这样使用 fgets:

fgets(filename, 20, stdin);

请注意,这还将在 filename 中读取换行符,因此您需要使用 strlen 将其删除。

其次,表达式 fopen("filename","r") 使用字符串 "filename" 作为文件名。只需去掉引号即可使用变量。

此外,您在外层 while 循环中调用了 feof(fp),但并未实际初始化 fp。不要那样做。相反,您应该将 fp = fopen(...) 放在单独的 if 语句中以确保它正确打开:

if (fp = fopen(...))
{
    // TODO: read file here
}
else
{
    // file could not be opened properly!
}

最后,您永远不会将 fgetc 的返回值分配给您的局部变量 c(顺便说一下,它需要是一个 int 以区分 EOF 和其他字符)。

关于c - fopen 语句中的文件名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25467208/

相关文章:

c - 在单位球体上产生随机位移

c++ - 从动态分配的二维数组指针中获取一行

控制程序输出的滚动

c - 使用 C 播放音频文件

c - 如何接受并同时哑掉不需要的输入? (扫描)

c - GtkApplication 和 gtk_init 有什么区别?

c - 使用 Atmega32 和 At42QT2100 的 SPI

c - C中三个数的最大值

c - 嗨,我有点困惑,我只是在 linux 中玩 gdb,我遇到了这个

c - 二维数组作为指向 char 数组的指针