在 C 中读取和写入 unsigned char 的缓冲区到文件?
Posted
技术标签:
【中文标题】在 C 中读取和写入 unsigned char 的缓冲区到文件?【英文标题】:Read and write a buffer of unsigned char to a file in C? 【发布时间】:2014-06-26 12:17:14 【问题描述】:以下代码将一个无符号字符数组(定义为byte
)写入文件:
typedef unsigned char byte;
void ToFile(byte *buffer, size_t len)
FILE *f = fopen("out.txt", "w");
if (f == NULL)
fprintf(stderr, "Error opening file!\n");
exit(EXIT_FAILURE);
for (int i = 0; i < len; i++)
fprintf(f, "%u", buffer[i]);
fclose(f);
如何将文件从out.txt
读回byte
的缓冲区?目标是通过byte
迭代缓冲区byte
。谢谢。
【问题讨论】:
如果你想读回来,我不会用%u
写出来。 %u
将是可变宽度输出,所以 1
需要一个字符,12
需要两个字符,依此类推。当你读回来看到 112
你不知道那是不是三个字符( 1, 1, 2) 或两个 (11, 2; 或 1, 12) 或仅一个 (112)。如果您需要 ASCII 文件,您将使用固定宽度的输出,例如 %03u
。这样每个字节总是 3 个字符。然后您可以使用fscanf("%03u", buffer[i])
一次读取一个字节。
嘿@lurker 谢谢!我怎样才能接受这个作为答案?您的帖子帮助我了解了我需要做什么。
谢谢。我将其发布为答案,这是我最初应该做的。
【参考方案1】:
如果你想读回来,我不会用%u
写出来。 %u
将是可变宽度输出,因此 1 需要一个字符,12
需要两个字符,依此类推。当你读回来看到 112
你不知道那是不是三个字符(1, 1, 2) 或两个 (11, 2; 或 1, 12) 或仅一个 (112)。如果您需要 ASCII 文件,您将使用固定宽度的输出,例如 %03u。这样每个字节总是 3 个字符。然后您可以使用fscanf("%03u", buffer[i])
一次读取一个字节。
【讨论】:
【参考方案2】:如何将文件从 out.txt 读回字节缓冲区?目标是逐字节迭代缓冲区。谢谢。
类似的东西应该适合你。 (未调试,远离我的编译器)
void FromFile(byte *buffer, size_t len)
FILE *fOut = fopen("out.txt", "rb");
int cOut;
int i = 0;
if (fOut == NULL)
fprintf(stderr, "Error opening file!\n");
exit(EXIT_FAILURE);
cOut = fgetc(fOut);
while(cOut != EOF)
buffer[i++] = cOut; //iterate buffer byte by byte
cOut = fgetc(fOut);
fclose(fOut);
【讨论】:
【参考方案3】:您可以(并且应该)使用fread()
和fwrite()
(http://www.cplusplus.com/reference/cstdio/fread/) 在FILE
s 和内存之间传输原始内存。
要确定文件的大小(建议 fread() 它应该读取多少字节)使用fseek(f, 0, SEEK_END)
(http://www.cplusplus.com/reference/cstdio/fseek/) 将光标放在文件末尾并使用ftell(f)
读取其大小(http://www.cplusplus.com/reference/cstdio/ftell/)。不要忘记使用fseek(f, 0, SEEK_SET)
跳回到开头以了解实际阅读过程。
【讨论】:
感谢您的回答。不幸的是,实现必须在 C 中。 所有提到的函数都是标准 C 库 (/the stdio.h) 的一部分。它们只是记录在 cplusplus.com 网站上。包含 stdio.h,您可以在任何 C 程序中使用它们。以上是关于在 C 中读取和写入 unsigned char 的缓冲区到文件?的主要内容,如果未能解决你的问题,请参考以下文章