如何从文件中读取const char *

时间:2017-01-11 11:26:10

标签: c file

我需要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

2 个答案:

答案 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