如何在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)
这不是写入文件的方式,如果您编译成功,那么根据此您将只能写入一个字节。如果我没听错的话,你必须实现一个循环 for
或 while
循环,以便将所有字节从一个文件写入另一个文件。
我在这里假设您正在尝试将数据从一个文件逐字节写入另一个文件,因此在此假设下,您的程序中有一些更改的工作代码..
#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中逐字节或分块写入()到文件的主要内容,如果未能解决你的问题,请参考以下文章