【问题标题】:How to control the data content of a file using the Linux system call read()?如何使用 Linux 系统调用 read() 控制文件的数据内容?
【发布时间】:2014-10-19 17:53:23
【问题描述】:

我有一个由换行符分隔的整数文件,例如:

277
123
456
.
.
.
等等

我可以使用 read() Linux 系统调用(例如

)读取文件内容并将其存储在数组缓冲区中
// open the file
fileDesc = open(filename,O_RDONLY);
// read the file if it opened successfully

read(fileDesc, buffer, MAX_BUFF_SIZE)

我还有更多内容,但是当我使用 printf(%c 格式)查看缓冲区的内容时,它会将文件内容存储为,

缓冲区[0] = 2
缓冲区[1] = 7
缓冲区[2] = 7
缓冲区[3] =
缓冲区[4] = 1
缓冲区[5] = 2
缓冲区[6] = 3
.
.
等等

我真的希望每个缓冲区索引在每个 \n 之前保存一个完整的值,例如

缓冲区[0] = 277
缓冲区[1] = 123
缓冲区[2] = 456
.
.
等等

有什么方法可以控制 read() 系统调用将文件内容存储到缓冲区中的方式吗?还是有更好的替代方法来完成这项任务?

谢谢。

【问题讨论】:

  • 解析内容并不难,但使用 stdio (fopen/ fgets / fscanf) 可能更容易

标签: c linux unix system-calls readfile


【解决方案1】:

使用缓冲的 C stdio 库将获得更好的成功。这是您需要的基本代码:

#include <stdio.h>

FILE *fp;
int n;


fp = fopen(filename, "r");
if (fp == NULL) ... // error, could not open

while (fscanf(fp, "%d", &n) == 1) {
    printf("n = %d\n", n);
}

【讨论】:

  • 如果函数 fscan 已经被缓冲了,我可以访问这个缓冲区的内容吗?我想使用这些内容对它们进行数学运算,而不是仅仅将它们打印出来。
  • 在 fscan() 之后,变量 n 将保存该值。
【解决方案2】:

将文本数据解析为数字不是操作系统提供的 I/O 例程的权限。他们只是按原样交付文件内容。

C 标准库提供了一些可以进行解析的函数。例如,看看strtol

请注意,您将有两个缓冲区,一个是 charunsigned char 类型,用于保存原始数据,另一个是适当的数字类型,可以保存解析后的值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-12
    • 1970-01-01
    相关资源
    最近更新 更多