Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何从文件中读取常量字符*_C_File - Fatal编程技术网

C 如何从文件中读取常量字符*

C 如何从文件中读取常量字符*,c,file,C,File,我需要从文本文件中读取文件名。 然后我必须使用它作为fopen的参数。 因此,我需要将其作为const char*读取,因为这是fopen接受作为第一个参数的类型。我该怎么做 我试过这样的方法: FILE *a; a=fopen("a.txt","r"); const char *filename fgets(filename,100,a); image=fopen(filename,"rb"); 当我这样做时,我收到了一个分段错误,这可能是错误的。我认为变量filename没有被f

我需要从文本文件中
读取
文件名
。
然后我必须使用它作为
fopen
的参数。 因此,我需要将其作为
const char*
读取,因为这是
fopen
接受作为第一个参数的类型。我该怎么做

我试过这样的方法:

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

当我这样做时,我收到了一个分段错误,这可能是错误的。我认为变量
filename
没有被
fopen
函数很好地接受。

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

此外,
fgets()
在if获取一行文本时保留换行符,因此需要删除该换行符。您应该检查
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");
}

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

const char *filename;
并且在尝试使用它之前不给它任何内存()

关于您的声明:
因此,我需要将其作为const char*读取

不一定。
fopen
原型的第一个参数:简单地保证在该位置传递的参数将在
fopen
函数中被视为
const char*
。 可以使用简单的
char*
传递参数,例如以下任一形式:

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


并且,如注释和其他答案中所述,在作为参数传递之前,删除换行符,
\n

const char*filename
-->
char filename[100]。另外,如果
filename
包含换行符,则有必要将其删除。我知道代码是错误的,我想知道正确的代码alternative@LazuRazvan我建议你仔细阅读C中常量(
const
)的用法。通过谷歌搜索“在C中使用const”可以得到很多结果。
fopen
需要一个字符指针作为参数;形式参数列表中的
const
仅表示指向的内存内容不会被
fopen()
更改。关键不是传递
fopen
a
const char*
,而是传递一个指向字符串的指针。因此,您的问题是如何从文件中读取字符串;试着用谷歌搜索一下,你会得到某种
char
array/pointer。
char filename[80];
strcpy(filename, "somefilename.txt");