我的目标是收集输入并根据该输入打开文件。
FILE*
open_input_file (char* fileName) //opens source file to be read
{
return fopen(fileName, "r");
}
在之前的函数中,我收集了用户的输入并将其保存到 fileName。当我调试程序时,它告诉我 fopen 正在返回 NULL。那不是我想要的,我不确定问题出在哪里。
int main(void)
{ FILE* inFile = NULL;
char infileName[32] = {'\0'};
gather_input(infileName); // infileName is an output parameter for this
inFile = open_input_file(infileName);
}
不知道是什么问题。有什么想法吗?
最佳答案
如果fopen
returns NULL
,打开失败。 errno
将保存 failure code和 strerror(errno)
将返回打开失败原因的简短描述。
#include <errno.h>
#include <string.h>
...
int main(void)
{ FILE* inFile = NULL;
char infileName[32] = {'\0'};
gather_input(infileName); // infileName is an output parameter for this
if (!(inFile = open_input_file(infileName))) {
fprintf(stderr, "Error opening '%s': %s\n",
infileName, strerror(errno));
} else {
// open successful
...
}
}
题外话
gather_input
最好确保 infileName
以 null 结尾,以防止缓冲区溢出。最简单的方法是将文件名缓冲区的大小定义为一个宏,并将最后一个字符设置为 0。
#define FILENAMELEN 32
void gather_input(char infileName[]) {
...
infileName[FILENAMELEN-1]=0;
}
int main(void)
{ FILE* inFile = NULL;
char infileName[FILENAMELEN] = {'\0'};
这不是很灵活。您可以改为将文件名缓冲区的大小传递给 gather_input
。
#define LENGTH(a) (sizeof(a) / sizeof(a[0]))
void gather_input(char infileName[], size_t len) {
...
infileName[len-1]=0;
}
int main(void)
{ FILE* inFile = NULL;
char infileName[32] = {'\0'};
gather_input(infileName, LENGTH(infileName)); // infileName is an output parameter for this
如果使用标准字符串操作函数,设置最后一个字符的替代方法是使用 strl*
函数 ( strlcpy
and strlcat
) 而不是它们的无限表亲。如果你没有使用 strl*
,你应该使用 strncpy
和 strncat
.
关于我可以将字符串传递给 fopen() 吗?在 c,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4181698/