读取和写入无符号字符的缓冲区到C中的文件?

时间:2014-05-08 21:41:09

标签: c file io char unsigned

以下代码将unsigned char数组(定义为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。感谢。

3 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分:2)

如果你想阅读它,我不会用%u来写出来。 %u将是可变宽度输出,因此1代表一个字符,12代表两个,等等。当您阅读它并查看112时,您不会知道这三个字符(1,1,2),或两个(11,2;或1,12)或只是一个(112)。如果需要ASCII文件,则可以使用固定宽度输出,例如%03u。这样每个字节总是3个字符。然后,您可以使用fscanf("%03u", buffer[i])一次读取一个字节。

答案 2 :(得分:1)

您可以(并且应该)使用fread()fwrite()http://www.cplusplus.com/reference/cstdio/fread/)在FILE和内存之间传输原始内存。

要确定文件的大小(建议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)跳回到实际阅读过程的开头。