【发布时间】: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个字符,为终止空字符保留数组的一个元素。 -
当打开操作失败时,程序需要处理错误(通常,如果错误不可处理,则退出。您的程序在打印有关打开失败的消息后继续执行需要更正的文件