C 中逐个字符读取文件

2024-03-27

我正在用 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) 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(使用前将#替换为@)

C 中逐个字符读取文件 的相关文章

随机推荐

  • 使用 Python 备份 Postgresql 数据库

    我想使用Python代码备份数据库 我想备份一些相关数据的表 如何备份以及如何使用 SELECT 语句选择所需的表 e g 我想获取一些表从 2014 05 01 到 2014 05 10 的数据 并将结果输出为 sql 扩展文件 如何使用
  • 从标头自动生成 C 代码

    我想生成头文件中定义的过程的空实现 理想情况下 它们应该为指针返回 NULL 为整数返回 0 等 并且在理想的情况下 还可以打印到 stderr 调用了哪个函数 这样做的动机是需要实现一个包装器 将复杂的现有 API 头文件 的子集适配到另
  • 适用于 i18n 的 FuelPHP ORM 数据库架构,意见/建议

    虽然这个问题可能是similar https stackoverflow com questions 929410 what are best practices for multi language database design to
  • CSS Sprite + 背景大小:覆盖

    有没有办法使用背景尺寸 封面在加载了 CSS Sprite 的图像上 示例代码 class img sprite background image url images sprite img png background repeat no
  • linux cron 作业是否应该用“&”指定以指示在后台运行? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 在 crontab 文件中 是否应该使用尾随 来指定命令 还是命令会在后台运行 I have 20 home me monitor check sh
  • Symfony2:警告:spl_object_hash() 期望参数 1 为对象,给定整数

    我在实体之间有多对一的关系Project and Course因为每门课程可以有许多项目 所以许多项目可能与同一门课程相关 这些是我的实体 class Project ORM Id ORM Column type integer ORM G
  • 图书馆项目是否合并清单文件?

    我正在考虑创建一个核心应用程序库 一个包含所有逻辑的库项目 一个免费版本 和一个使用该库的完整版本 据我了解 清单中的某些内容不会合并 例如权限和活动 版本代码是否合并 我可以在库中放置一个版本代码来同时应用于免费和付费版本吗 第二个问题是
  • 如何在 Shiny 中更改输入后保留滚动位置

    在 Shiny 中 我使用带有大量项目的水平 radioGroupButtons 输入 如果单击其中一项 按钮标签的颜色会发生变化 这实际上很好用 但是 如果我单击最后一项 以便滚动到最右侧 则滚动位置将重置 因此 每次单击后 如果我想继续
  • Hibernate 将重复项插入到 @OneToMany 集合中

    我有一个关于 Hibernate 3 6 7 和 JPA 2 0 的问题 考虑以下实体 为简洁起见 省略了一些 getter 和 setter Entity public class Parent Id GeneratedValue pri
  • Mono mkbundle 工具无法创建二进制文件,并抱怨输出文件不可用

    根据来自的建议这个线程 https stackoverflow com questions 551554 can you compile c without using the net framework在运行没有 NET 的 C 应用程序
  • postgresql 存储过程开始提交结束

    实际上 在执行 postgresql 存储过程时我很困惑 我从某处学到了以下内容 create or replace procedure update dba trades language plpgsql as begin CODE BL
  • 完成部分网格并使其不漏水

    我正在从 RealSense 相机捕获点云 并使用 Trimesh 库将它们转换为网格 问题是我只能从中得到一个不防水的网格 如何 完成 网格并使其防水 I tried trimesh repair broken faces mesh co
  • jquery切换 - 在切换功能之间切换?

    大家好 我喜欢 jquery 的切换功能 然而目前我面临一个小问题 我不知道如何以最好的方式解决它 我有一个名为 searchbox 的 div 它取决于用户设置是隐藏还是可见 如果我单击按钮 则触发的切换功能应该是 slideDown s
  • 创建Python包并导入模块

    我正在尝试编写我的第一个 Python 包 几乎所有模块都需要使用 NumPy 我应该写吗import numpy在每个模块中或者包中是否有某个地方我可以将其导入一次 以便每个模块都可以使用它 最好的方法是什么 是的 只需将其导入到需要的地
  • 在 iTunes Connect 中提交应用程序时附加屏幕截图的顺序

    我目前正在提交我的应用程序以供审核 并且我已经上传了主屏幕截图 但不确定如何让我的其他屏幕截图以正确的顺序显示 您必须在上传之前将它们全部选择 并且没有任何指示它们的顺序 有人可以告诉我您是否需要按正确顺序或相反顺序选择屏幕截图吗 以相反的
  • Cloud Dataflow 中的作业失败:启用 Dataflow API

    我目前正在尝试将 Dataflow 与 Pub Sub 结合使用 但收到此错误 工作流程失败 原因 6e74e8516c0638ca 刷新您的凭据时出现问题 请检查 1 为您的项目启用Dataflow API 2 您的项目有一个机器人服务帐
  • 在 Visual Studio 2010 项目中包含外部库

    我是视觉工作室的新手 似乎无法在任何地方找到这个问题的答案 我正在使用 VS2010 进行 VC 项目 我有另一个项目构建到 lib 文件中并设置为参考 但无法弄清楚如何实际包含标头 事实证明谷歌毫无用处 请帮忙 通常 这是通过将包含文件所
  • qt/c++ 动态命名变量

    我正在为我的一项大学作业在 Qt 中开发一个 html 编辑器 并且我在某些变量的命名方面遇到了问题 问题是这样的 当用户决定加载他们的 项目 时 程序会迭代该文件夹并查找其中有多少个 html 文件 然后它会创建要显示的选项卡 我有一个自
  • Symfony2 Assetic 路由和资源错误

    我有一个模板 例如index html php 我在其中使用 php assetic 加载器 如下所示 如果我对模板文件进行任何更改 我会得到路线 assetic 2b431f4 不存在 如果我改变 assetic use controll
  • C 中逐个字符读取文件

    我正在用 C 语言编写 BF 解释器 但在读取文件时遇到了问题 我以前用过scanf为了读取第一个字符串 但是你的 BF 代码中不能有空格或注释 现在这就是我所拥有的 char readFile char fileName FILE fil