2017-01-11 129 views
-1

我需要从文本文件中获取read a filename。 然后我必须用它作为fopen的参数。 因此,我需要将它作为const char*来读取,因为这是fopen接受的第一个参数。我该怎么做呢?如何从文件中读取const char *

我想是这样的:

FILE *a; 
a=fopen("a.txt","r"); 
const char *filename 
fgets(filename,100,a); 
image=fopen(filename,"rb"); 

有些事情是错的,因为我得到一个分段错误当我这样做。我认为变量filename不被fopen函数收到。

+3

'const char * filename' - >'char filename [100];'。另外如果'filename'包含换行符,则需要将其删除。 – BLUEPIXY

+0

我知道代码是错误的,我想知道正确的替代 –

+1

@LazuRazvan我建议你阅读C中常量('const')的用法。有很多结果只是从谷歌搜索“在C中使用const” 。 –

回答

0

您可能已经看到fopen()需要(const char *)类型的参数,但是您需要能够在将其传递给该函数之前修改该字符串。此外,您需要为您的字符串分配空间,并且您可能会考虑为超过100个空间分配空间。 stdio.h头文件包含宏FILENAME_MAX,它扩展为一个数组的正确大小的整数常量,该数组将保存系统上最长的文件名字符串。例如,您可以使用char filename[FILENAME_MAX];。当在fopen()的调用中遇到标识符filename时,根据函数原型,它将衰变为指向char的指针,该指针被转换为指向const char的指针。

此外,fgets()保留换行时,如果提取一行文本,所以你需要删除它。您应该检查fgets()的结果,因为它在发生错误时返回NULL指针,或者在文件结束时调用该指针;否则返回指向filename[]中第一个char的指针。

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"); 
} 
0

首先,您的seg故障可能来自尝试使用您不拥有的内存。即通过创建变量:

const char *filename; 

,而不是试图使用它之前给它的任何内存([c][m]alloc)。

关于您的声明:
因此,我需要读取它作为一个常量字符*

不一定。
fopen原型的第一个参数:"FILE *fopen(const char *filename, const char *mode)"只是保证在该位置传递的参数在fopen函数内将被视为const char *。 参数可以使用简单的char *传递,例如。下面这些形式:

char *filename = {"somefilename.txt"}; 

char filename[80]; 
strcpy(filename, "somefilename.txt"); 

而且,正如在评论中提到的,和其他的答案,作为参数传递之前删除换行符,\n