【问题标题】:How concatenate two char arrays to open file from fopen in C?如何连接两个 char 数组以在 C 中从 fopen 打开文件?
【发布时间】:2015-01-12 09:30:11
【问题描述】:

我在使用 c 中的“fopen”动态打开文件时遇到问题。 以下代码连接两个数组,它可以正常打开文件。

char path[50] = "/boot/config-";
char kernel[50] = "3.16.3";
strcat(path, kernel);
FILE *infile = fopen(path, "r"); //file opening successfully
if(infile == NULL){printf("failed to open file");}

但是,当我尝试动态填充内核数组并将其与路径数组连接时,它无法打开文件。

char path[50] = "/boot/config-";
char kernel[50] = "";

FILE *fp = popen("uname -r", "r");//executing command for kernel version 3.16.3

if (fp != NULL){
    while (fgets(kernel, sizeof(kernel)-1, fp) != NULL) {
        printf("%s", kernel);//print 3.16.3
    }
    strcat(path,kernel);
}

FILE *infile = fopen(path, "r"); //failed to open file
if(infile == NULL){printf("failed to open file");}

【问题讨论】:

  • 可能包含换行符。
  • 改为printf("'%s'", kernel);,你会发现 BLUEPIXY 可能是对的
  • DoomProg 击中了它的头——不管它是否是您的问题的原因,像这样将静态字符串分配给字符数组是错误的。您实际上是在静态分配一个数组,然后将指向该数组的指针重新指向另一个包含静态"/boot/config-""3.16.3""" 的内存位置。您需要使用strcpy 等将字符串放入char 数组中。
  • 顺便说一句,你可以使用fgets(kernel, sizeof(kernel), fp)fgets 将最多读取sizeof(kernel)-1 个字符,为终止空字符保留数组的一个元素。
  • 当打开操作失败时,程序需要处理错误(通常,如果错误不可处理,则退出。您的程序在打印有关打开失败的消息后继续执行需要更正的文件

标签: c linux file char kernel


【解决方案1】:

fgets 包含换行符。有时很难注意到这就是为什么我通常将此打印用于单一测试目的,你可以准确地看到你是否有奇怪的字符换行等。

printf("|%s|", path)

解决这个问题的最简单方法就是这样做:

unsigned int strlength = strlen(path);
if (path[strlength - 1] == '\n') {
    path[strlength - 1] = '\0';    
}

【讨论】:

  • 技术上,strlen 的返回是size_t 而不是unsigned。虽然它们通过#define 本质上是相同的,但是将您的类型与返回类型相匹配是一个好习惯。
【解决方案2】:

我个人在项目中使用动态fopen。

#define LOG
#define LOG_FILE "s:/results"
#define MODE "_MODE_1"

#ifdef LOG
FILE* fp = fopen(LOG_FILE MODE ".txt", "w");
#endif

【讨论】:

  • 您至少可以解释一下,您指望在 C 中自动连接字符串文字才能使其正常工作。那么您可能会意识到问题是如何连接非文字字符串变量,因此此方法不适用。
猜你喜欢
  • 1970-01-01
  • 2021-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-08
  • 1970-01-01
  • 2015-07-28
  • 2011-12-16
相关资源
最近更新 更多