【问题标题】:Read and write a buffer of unsigned char to a file in C?在 C 中读取和写入 unsigned char 的缓冲区到文件?
【发布时间】: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 谢谢!我怎样才能接受这个作为答案?您的帖子帮助我了解了我需要做什么。
  • 谢谢。我将其发布为答案,这是我最初应该做的。

标签: c file io char unsigned


【解决方案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 程序中使用它们。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-10
      • 2019-06-30
      • 2011-07-05
      • 1970-01-01
      • 2014-10-29
      • 2021-11-02
      相关资源
      最近更新 更多