我可以将字符串传递给 fopen() 吗?在 c

标签 c

我的目标是收集输入并根据该输入打开文件。

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 codestrerror(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*,你应该使用 strncpystrncat .

关于我可以将字符串传递给 fopen() 吗?在 c,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4181698/

相关文章:

c - mpirun 不传递命令行参数

c - 数据未存储在接收数据寄存器中,(UART RXNE 标志未设置)

c - 什么是 unsigned char 数组以及如何声明和初始化它

c - strtol 不从读取(fd、缓冲区、ssize_t)转换字符串

c - `write(2)` 到本地文件系统的原子性

c - 使用 D-Bus API 读取时 Bluez 超时

C 将字符串/字符输入转换为 float

c++ - 如何在win32 windows中创建一个嵌入式文本输入框

C 回调的 Python 包装

c - 加载运行者: String Array