c - 在C中逐字符读取文件

标签 c file-io io iostream

我正在用 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. 如果文件大于 1,000 字节怎么办?
  2. 每次读取一个字符时,您都在增加 code,并将 code 返回给调用者(即使它不再指向字符的第一个字节malloc 返回的内存块)。
  3. 您正在将 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/

相关文章:

C-在一定范围内具有x个因子的数字的数量

linux - 从/dev/block/mmcblk0 和/dev/block/mmcblk0p1 读取的区别

Java文件加密,无法让它接受文件输入

visual-studio - TFS 2005下永久删除

Python 将 std(in/out/err) 流式传输到另一个进程

c - 使用c中的文件路径打开文件

c - 在 Release模式下延迟加载dll

java - 输入流/读取器是否总是意味着关闭?

Python:创建文本文件,写入,替换字符串

检查一个元素是否在数组中或者不是无限循环