如何在C中逐字节或分块写入()到文件

Posted

技术标签:

【中文标题】如何在C中逐字节或分块写入()到文件【英文标题】:How to write() to a file byte by byte or in chunks in C 【发布时间】:2021-08-24 17:19:47 【问题描述】:

我正在尝试逐个字节、2 个字节、4 个字节等以块的形式将其写入文件。我目前有这段代码,但是卡住了。

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include<stdio.h>
#include<fcntl.h>
#include<errno.h>


int main(int argc, char* argv[])

    char buf[1];

    //creating output file
    int outfile = open(argv[1], O_CREAT | O_APPEND | O_RDWR, 0666);

    int infile = open(argv[2], O_RDONLY);

    fread = read(infile, buf, 1);
    printf("%s\n", buf);
    write(outfile);
    close(infile);
    close(outfile)


【问题讨论】:

你需要一个循环。 使用read/write处理单个字节非常低效。最好使用缓冲 IO。 read/write 也是很低级的。您需要大量代码来处理不完整的 IO。 printf("%s\n", buf); 在读取单个字节时不好。也许你想要printf("%c\n", buf[0]); 【参考方案1】:

在您当前的代码中,您读取 1 个字节,然后使用 %s 打印它。那是行不通的。 %s 用于打印字符串,字符串必须以零结尾,但在使用 read 时不会得到以零结尾的字符串(此外,数组 buf 只能保存一个空字符串)。我假设你想打印你读到的数据,所以这样做:

printf("%c\n", buf[0]);

要读取整个文件,您需要一个循环:

while((fread = read(infile, buf, 1)) > 0)

    printf("%c\n", buf[0]);

关于块大小,您只能设置最大值,但read 可能会返回更少的字节。所以喜欢:

#define MAX_BYTES_IN_A_SINGLE_READ 4

设置最大块大小并像这样使用它:

char buf[MAX_BYTES_IN_A_SINGLE_READ];
ssize_t fread;
while((fread = read(infile, buf, MAX_BYTES_IN_A_SINGLE_READ)) > 0)

    for (ssize_t i = 0; i < fread; ++i)
    
        printf("%c\n", buf[i]);
    

【讨论】:

【参考方案2】:

首先在这里我看不到你在哪里声明了fread 变量,

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include<stdio.h>
#include<fcntl.h>
#include<errno.h>


int main(int argc, char* argv[])

    char buf[1];

    //creating output file
    int outfile = open(argv[1], O_CREAT | O_APPEND | O_RDWR, 0666);

    int infile = open(argv[2], O_RDONLY);

    fread = read(infile, buf, 1); // here fread var !!?
    printf("%s\n", buf);
    write(outfile);
    close(infile);
    close(outfile)


这不是写入文件的方式,如果您编译成功,那么根据此您将只能写入一个字节。如果我没听错的话,你必须实现一个循环 forwhile 循环,以便将所有字节从一个文件写入另一个文件。

我在这里假设您正在尝试将数据从一个文件逐字节写入另一个文件,因此在此假设下,您的程序中有一些更改的工作代码..

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include<stdio.h>
#include<fcntl.h>
#include<errno.h>


int main(int argc, char* argv[])
    int fread =0;
    char buf[1]; 

    //creating output file
    int outfile = open(argv[1], O_CREAT | O_APPEND | O_RDWR, 0666);

    int infile = open(argv[2], O_RDONLY);
    
    while(fread = read(infile, buf, 1)) //change here number of bytes you want to read at a time and don't forget to change the buffer size too :)
    printf("%s\n", buf);
    write(outfile, buf, fread);
   
    close(infile);
    close(outfile)


【讨论】:

while(fread = read(infile, buf, 1)) 不好,因为 read 在错误时返回 -1 printf("%s\n", buf); 不如read 不返回字符串 是的,但实际上这家伙在文件处理方面似乎是新人,所以我没有编辑太多代码,并试图让他轻松处理任何他想要做的事情......关于你的观点,我在这里我假设当 infile 中没有任何内容可读取并且从 while 循环中出来时它会出错。 谢谢,我是文件处理新手。只需确定我是否想一次写入 2 个字节 id 将 char buff[1] 更改为 char buff[2] 并将读取函数中的数字更改为 2? 是的,完全正确.. 缓冲区必须足以容纳数据。您还可以分配像buff[10]这样的大缓冲区,并根据您的需要读取2,3,4,5字节的数量。

以上是关于如何在C中逐字节或分块写入()到文件的主要内容,如果未能解决你的问题,请参考以下文章

在java中逐字节读取[关闭]

Objective C - 创建文本文件以在 Cocoa 中逐行读取和写入

如何在matlab中从nifti图像中逐片写入?

从数据库中逐行将数据写入文本框

如何在目标c中逐行解析JSON文件

如何在lua中设置文件写入函数调用的长度?