我正在用 C 编写 BF 解释器,但在读取文件时遇到了问题。我曾经使用 scanf
为了读取第一个字符串,但是你的 BF 代码中不能有空格或注释。
现在这就是我所拥有的。
char *readFile(char *fileName)
{
FILE *file;
char *code = malloc(1000 * sizeof(char));
file = fopen(fileName, "r");
do
{
*code++ = (char)fgetc(file);
} while(*code != EOF);
return code;
}
我知道问题出在我如何将文件中的下一个字符分配给代码指针,但我不确定那是什么。
我缺乏指针知识,这是本练习的重点。
解释器工作正常,全部使用指针,我只是在读取文件时遇到问题。
(稍后我将只实现将 +-><[].,
读取到文件中,如果有人有好的方法,请告诉我!)
最佳答案
您的代码有很多问题:
char *readFile(char *fileName)
{
FILE *file;
char *code = malloc(1000 * sizeof(char));
file = fopen(fileName, "r");
do
{
*code++ = (char)fgetc(file);
} while(*code != EOF);
return code;
}
- 如果文件大于 1,000 字节怎么办?
- 每次读取一个字符时,您都在增加
code
,并将code
返回给调用者(即使它不再指向字符的第一个字节malloc
返回的内存块)。 - 您正在将
fgetc(file)
的结果转换为char
。在将结果转换为char
之前,您需要检查EOF
。
维护 malloc
返回的原始指针很重要,这样您就可以稍后释放它。如果我们忽略文件大小,我们仍然可以通过以下方式实现这一点:
char *readFile(char *fileName)
{
FILE *file = fopen(fileName, "r");
char *code;
size_t n = 0;
int c;
if (file == NULL)
return NULL; //could not open file
code = malloc(1000);
while ((c = fgetc(file)) != EOF)
{
code[n++] = (char) c;
}
// don't forget to terminate with the null character
code[n] = '\0';
return code;
}
有多种系统调用可以为您提供文件的大小;一个常见的是 stat
.
关于c - 在C中逐字符读取文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4823177/