使用 POSIX API 读取文件

2024-03-08

考虑以下代码段,用于将文件内容读入缓冲区

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#define BLOCK_SIZE 4096

int main()
{
   int fd=-1;
   ssize_t bytes_read=-1;
   int i=0;
   char buff[50];
   //Arbitary size for the buffer?? How to optimise.
   //Dynamic allocation is a choice but what is the
   //right way to relate the file size to bufffer size.

   fd=open("./file-to-buff.txt",O_RDONLY);
   if(-1 == fd)
   {
      perror("Open Failed");
      return 1;
   }

   while((bytes_read=read(fd,buff,BLOCK_SIZE))>0)
   {
      printf("bytes_read=%d\n",bytes_read);
   }

   //Test to characters read from the file to buffer.The file contains "Hello"
   while(buff[i]!='\0')
   {
      printf("buff[%d]=%d\n",i,buff[i]);
      i++;
      //buff[5]=\n-How?
   }
   //buff[6]=`\0`-How?
   close(fd);
   return 0;
}

代码说明:

  • 输入文件包含字符串“Hello”
  • 需要将此内容复制到缓冲区中。
  • 目标是通过以下方式实现的open and readPOSIX API。
  • 读取 API 使用指向 * 的缓冲区的指针任意大小* 将数据复制进去。

问题:

  • 动态分配是优化缓冲区大小必须使用的方法。从输入文件大小关联/导出缓冲区大小的正确过程是什么?
  • 我看到在最后read读取操作复制了一个new line character and a NULL除了字符之外的字符"Hello"。请详细说明这种 read 行为。

样本输出

字节读取=6

增益[0]=H

增益[1]=e

增益[2]=l

增益[3]=l

增益[4]=o

buff[5]=

PS:输入文件是用户创建的文件,而不是由程序创建的(使用write应用程序编程接口)。只是在这里提一下,以防万一有什么不同。


由于要读取整个文件,因此最好的方法是使缓冲区与文件大小一样大。随时调整缓冲区大小是没有意义的。这只会在没有充分理由的情况下损害性能。

您可以通过多种方式获取文件大小。快速而肮脏的方法是lseek()到文件末尾:

// Get size.
off_t size = lseek(fd, 0, SEEK_END); // You should check for an error return in real code
// Seek back to the beginning.
lseek(fd, 0, SEEK_SET);
// Allocate enough to hold the whole contents plus a '\0' char.
char *buff = malloc(size + 1);

另一种方法是使用获取信息fstat():

struct stat fileStat;
fstat(fd, &fileStat); // Don't forget to check for an error return in real code
// Allocate enough to hold the whole contents plus a '\0' char.
char *buff = malloc(fileStat.st_size + 1);

要获取所有所需的类型和函数原型,请确保包含所需的标头:

#include <sys/stat.h> // For fstat()
#include <unistd.h>   // For lseek()

注意read()不会自动终止数据\0。您需要手动执行此操作,这就是我们为缓冲区分配额外字符(大小+1)的原因。原因是已经有一个\0你的情况中的字符纯粹是随机的。

当然,自从buf现在是一个动态分配的数组,当你不再需要它时,不要忘记再次释放它:

free(buff);

但请注意,分配与要读入的文件一样大的缓冲区可能很危险。想象一下(无论是错误还是故意,都没关系)文件有几 GB 大。对于这种情况,最好设置最大允许大小。但是,如果您不希望有任何此类限制,那么您应该切换到另一种从文件读取的方法:mmap(). With mmap(),您可以将文件的一部分映射到内存。这样,文件有多大并不重要,因为您一次只能处理文件的一部分,从而控制内存使用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 POSIX API 读取文件 的相关文章

  • 捕获 .aspx 和 .ascx 页面中的异常

    问题说明了一切 请看以下示例代码 ul li li ul
  • EntityHydrate 任务失败

    我最近安装了 Visual Studio 11 Beta 和 Visual Studio 2010 之后 我无法在 Visual Studio 2010 中构建依赖于 PostSharp 的项目 因此我卸载了 Visual Studio 1
  • strlen() 编译时优化

    前几天我发现你可以找到编译时strlen使用这样的东西 template
  • 在 C++ 代码中转换字符串

    我正在学习 C 并开发一个项目来练习 但现在我想在代码中转换一个变量 字符串 就像这样 用户有一个包含 C 代码的文件 但我希望我的程序读取该文件并插入将其写入代码中 如下所示 include
  • Boost ASIO 串行写入十六进制值

    我正在使用 ubuntu 通过串行端口与设备进行通信 所有消息都必须是十六进制值 我已经在 Windows 环境中使用白蚁测试了通信设置 并得到了我期望的响应 但在使用 Boost asio 时我无法得到任何响应 以下是我设置串口的方法 b
  • 在 Mono 中反序列化 JSON 数据

    使用 Monodroid 时 是否有一种简单的方法可以将简单的 JSON 字符串反序列化为 NET 对象 System Json 只提供序列化 不提供反序列化 我尝试过的各种第三方库都会导致 Mono Monodroid 出现问题 谢谢 f
  • 如何向 Mono.ZeroConf 注册服务?

    我正在尝试测试 ZeroConf 示例http www mono project com Mono Zeroconf http www mono project com Mono Zeroconf 我正在运行 OpenSuse 11 和 M
  • MVC 5 中具有 ASP.NET Identity 的 Autofac 不会验证 OWIN 管道中的安全标记

    我在 MVC 5 中设置了 AutoFac 来与 ASP NET Identity 一起使用 表面上一切似乎都工作正常 即用户可以创建帐户并登录 但后来我发现 当安全标记更改时 用户不会注销 通过在 AspNetUsers 表中进行暴力破解
  • vagrant ssh -c 并在连接关闭后保持后台进程运行

    我正在编写一个脚本来启动和后台流浪机器内的进程 似乎每次脚本结束和 ssh 会话结束时 后台进程也会结束 这是我正在运行的命令 vagrant ssh c cd vagrant src nohup python hello py gt he
  • Libev,如何将参数传递给相关回调

    我陷入了 libev 中争论的境地 通常 libev 在类似的函数中接收包 接收回调 没关系 但是实际操作中 我们需要派遣一个亲戚 写回调 根据收到的包裹处理具体工作 例如 S RECV MSG pstRecvMsg S RECV MSG
  • 让 TeXstudio 在 linux mint 中工作:找不到文件“url.sty”。

    刚刚切换到 Linux Mint 以前的顽固 Windows 用户 我在尝试安装 TeXstudio 时遇到一些问题 Sudo apt get install texstudio 给了我一个正确的安装 至少 我是这么认为的 但是当我尝试构建
  • Unity c# 四元数:将 y 轴与 z 轴交换

    我需要旋转一个对象以相对于现实世界进行精确旋转 因此调用Input gyro attitude返回表示设备位置的四元数 另一方面 这迫使我根据这个四元数作为默认旋转来计算每个旋转 将某些对象设置为朝上的简单方法如下 Vector3 up I
  • 我们可以通过指针来改变const定义的对象的值吗?

    include
  • C++ 指针引用混淆

    struct leaf int data leaf l leaf r struct leaf p void tree findparent int n int found leaf parent 这是 BST 的一段代码 我想问一下 为什么
  • C:设置变量范围内所有位的最有效方法

    让我们来int举个例子 int SetBitWithinRange const unsigned from const unsigned to To be implemented SetBitWithinRange应该返回一个int其中所有
  • 构建 C# MVC 5 站点时项目之间的处理器架构不匹配

    我收到的错误如下 2017 年 4 月 20 日构建 13 23 38 C Windows Microsoft NET Framework v4 0 30319 Microsoft Common targets 1605 5 警告 MSB3
  • 如何高效计算连续数的数字积?

    我正在尝试计算数字序列中每个数字的数字乘积 例如 21 22 23 98 99 将会 2 4 6 72 81 为了降低复杂性 我只会考虑 连续的数字 http simple wikipedia org wiki Consecutive in
  • 如何组合两个 lambda [重复]

    这个问题在这里已经有答案了 可能的重复 在 C 中组合两个 lambda 表达式 https stackoverflow com questions 1717444 combining two lamba expressions in c
  • winform c# 中的弹出窗口

    我正在开发一个需要弹出窗口的项目 但问题是我还希望能够通过表单设计器在此弹出窗口中添加文本框等 所以基本上我有一个按钮 当您单击它时 它将打开我在表单设计器中设计的另一个窗口 我一直在谷歌搜索 但还没有找到我需要的东西 所以我希望你们能帮助
  • 嵌入式linux编写AT命令

    我在向 GSM 模块写入 AT 命令时遇到问题 当我使用 minicom b 115200 D dev ttySP0 term vt100 时它工作完美 但我不知道如何在 C 代码中做同样的事情 我没有收到任何错误 但模块对命令没有反应 有

随机推荐

  • 使用 RMySQL 的 UTF8 编码

    我正在尝试从 mysql 数据库查询数据 当然 其中包含一些字符串 对于连接和数据检索 我在 R 中使用 RMySQL 效果很好 除了一件事 我正在检索的字符串似乎不是 utf8 格式的 但我需要这个 因为这些字符串中有一些德语 Umlau
  • Python:检查两个列表之间字符串的部分匹配

    我有两个列表 如下所示 c John query 989877 forcast Tamm isl My name is Anne Query 989877 John Tamm Ju 我想检查其中的每一项isl中的每一项c这样我就可以得到所有
  • Android 上的 RTSP 客户端实现

    我看到很多与此相关的问题 尽管如此 我认为我的答案还没有 我想在 Android 上使用已编码的 RTSP 客户端与 MediaCodec 一起使用 以便捕获 H264 中的 RTSP 流 然后解码并显示它 我使用了 VideoView 和
  • 在仅限 iPhone 的应用程序中播放 YouTube 视频 - 失去控制

    下面的代码用于在视图上放置一个小的 WebView 以便用户可以点击它 视频会以全屏模式打开并播放 所有这些都有效 但游戏 4 秒后控件就会消失并且不会重新出现 点击 旋转 视频结束后 控件会重新出现 并且 完成 按钮变为可用 然而 一旦
  • 将 CallByName 与表单字段的“事件接收器”结合使用

    我的应用程序中的几个表单上都有文本框 这些文本框具有 缩放 功能 双击它们 会出现一个弹出表单 您可以根据自己的喜好调整大小和编辑内容 这是通过类模块 appZoomText 进行编码的 该模块充当文本框事件的 事件接收器 我正在尝试创建一
  • 想要创建一个 Dictionary 类型的自定义类

    我想创建一个基本上包装字典的自定义类 我想向其添加一个名为 Name 的属性 I tried public class MyDictionary
  • Chrome 声称简单函数未定义

    我在空闲时间制作了一个莫尔斯电码翻译器 并且第一次在 Chrome 中尝试了它 当 的时候translate 函数被调用 Chrome 抛出异常Uncaught TypeError translate is not a function a
  • 如何将“$modalInstance”注入控制器?

    在我的应用程序中 当我发现用户未登录后 我想打开一个模式对话框 when showtask id templateUrl Home Template showtask resolve ShowTaskCtrl resolve access
  • 为什么在 Python 中隐式检查是否为空? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 块的逆是什么:以 rebol / red 加载文本

    假设我有一些 rebol red 代码 如果我加载源文本 我会得到一个块 但是如何从块中取回源文本 我尝试了表单块 但它没有返回源文本 text Red Title Red Pretty Printer out none output te
  • Javascript 中的会话值

    如何在 JavaScript 中读取和写入会话值 如果您谈到服务器端会话值 除了以某种方式与服务器通信之外没有其他方法 例如 使用异步回调 您可以使用某种方法读取 写入它们 对于客户端会话变量的模拟 您可能想看看here http www
  • 无法通过代理推送到github

    请帮忙 我正在尝试从我的工作场所推送到 github 我试过这个 myuser somewhere c sites mrquery master git remote add origin ssh email protected cdn c
  • 创建 React 应用程序已部署,但 github 页面显示来自 manifest.json 的 404

    谁能帮我找出清单 json 文件的问题 我将一个简单的入门 create react 应用程序部署到 github 页面 并通过命令行显示该应用程序已发布 但当我转到 github 页面时页面未加载 当我查看控制台时 我收到来自 manif
  • 单例类方法的并发调用

    我有一个单例类 public class Singleton private static Singleton istance null private Singleton public synchronized static Single
  • 推荐一个用 C# 读取 Excel 文件的教程 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我有 C 经验 但使用 C 读取 Excel 内容的经验有限 我的任务非常简单 只需读取 Excel 文档的每一行的每一列并检索它们的值
  • 重新调度键盘事件

    正在开发 Angular TypeScript 应用程序 其中我们有一个自定义的基本文本编辑器 尝试适当地处理用户突出显示的选择然后按下按键以替换该选择的情况 为了解决这个问题 我们需要在插入其预期内容之前正确删除他们选择的 隐藏 组件 我
  • 间接参数化时如何注释request.param?

    In the 间接参数化示例 https docs pytest org en stable example parametrize html indirect parametrization我想输入提示request param表示特定类
  • 字符串中至少一定数量的数字的正则表达式

    当用户提交表单时 我需要确保输入至少包含最小数量的数字 问题是我不知道输入的格式 数字可能不会连续 并且可能由字母 标点符号 空格等分隔 我不关心其余的字符串 我想用 RegularExpressionValidator 检查这一点 但我不
  • Android切换到gradle不编译JRE7代码功能

    我将 Android 应用程序移至 Android Studio 而没有切换到 Gradle 现在我想转到 Gradle 该应用程序在切换到 Gradle 之前在 Android Studio 中进行编译 但现在我已经设置好 Gradle
  • 使用 POSIX API 读取文件

    考虑以下代码段 用于将文件内容读入缓冲区 include