我正在用 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)
to char
。您需要检查EOF
在将结果投射到之前char
.
维护返回的原始指针很重要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 http://pubs.opengroup.org/onlinepubs/009695399/functions/stat.html.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)