我需要read
来自文本文件的filename
。
然后我必须将它用作fopen
的参数。
因此,我需要将其作为const char*
来阅读,因为这是fopen
作为第一个参数接受的类型。我该怎么做呢?
我尝试过类似的事情:
FILE *a;
a=fopen("a.txt","r");
const char *filename
fgets(filename,100,a);
image=fopen(filename,"rb");
当我执行此操作时收到分段错误时出现问题。我认为filename
函数不能很好地接收变量fopen
。
答案 0 :(得分:0)
您可能已经看到fopen()
接受(const char *)
类型的参数,但您需要能够在将其传递给函数之前修改它。此外,您需要为字符串分配空间,并且可以考虑为超过100 char
s分配空间。 stdio.h
头文件包含宏FILENAME_MAX
,它扩展为一个数组的正确大小的整数常量,该数组将保存系统中可能存在的最长文件名字符串。例如,您可以使用char filename[FILENAME_MAX];
。当在filename
的调用中遇到标识符fopen()
时,它会衰减到指向char
的指针,该指针将根据函数原型转换为指向const char
的指针
此外,如果获取一行文本,fgets()
会保留换行符,因此您需要将其删除。您应该检查fgets()
的结果,因为它在发生错误时返回NULL
指针,或者在文件结束时调用它;否则它会返回指向char
中第一个filename[]
的指针。
FILE *a;
a=fopen("a.txt","r");
char filename[FILENAME_MAX];
char *ch;
ch = fgets(filename,FILENAME_MAX,a);
/* Remove trailing newline */
if (ch) {
while (*ch != '\0' && *ch != '\n') {
++ch;
}
if (*ch == '\n') { // replace '\n' with '\0'
*ch = '\0';
}
image=fopen(filename,"rb");
}
答案 1 :(得分:0)
首先,您的seg错误可能来自于尝试使用您不拥有的内存。即通过创建变量:
const char *filename;
在尝试使用它之前,不要给它任何记忆( [c][m]alloc )。
关于你的陈述:
因此,我需要将其读作const char * 。
不一定
fopen
原型的第一个参数: "FILE *fopen(const char *filename, const char *mode)" 只是保证在该位置传递的参数将被视为const char *
中的fopen
功能。
参数可以使用简单的char *
传递,例如。以下任何一种形式:
char *filename = {"somefilename.txt"};
或
char filename[80];
strcpy(filename, "somefilename.txt");
并且,正如评论和其他答案中所述,在作为参数传递之前删除换行符\n
。