程序将询问您要打开的文件的文件名。然后内容将显示在屏幕上。这是我到目前为止所得到的,我知道这是错误的。我保存在变量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/