【问题标题】:NULL character changing output fileNULL 字符更改输出文件
【发布时间】:2017-08-04 15:51:02
【问题描述】:

我有一个函数:

int csv_fwrite2 (FILE *fp, const void *src, size_t src_size, unsigned char quote){
    const unsigned char *csrc = src;

    if (fp == NULL || src == NULL)
        return 0;

    if (fputc(quote, fp) == EOF)
        return EOF;

    while (src_size) {
        if (*csrc == quote) {
            if (fputc(quote, fp) == EOF)
                return EOF;
        }
        if (fputc(*csrc, fp) == EOF)
            return EOF;
        src_size--;
        csrc++;
    }

    if (fputc(quote, fp) == EOF) {
        return EOF;
    }

    return 0;
}

基本上,它获取 src 中的内容并将 src 的内容输出到文件(csv 格式)中,引号字符将是您传递的任何参数。

例如。

src = ["name", "age", "gender"]; csv_fwrite2 (fp, src, src_size, '"');

在输出文件中,它将包含: "name","age","gender"

如果:

src = ["name", "age", "gender"]; csv_fwrite2 (fp, src, src_size, '|');

那么输出是:

|name|,|age|,|gender|

一切正常,但是当我输入 NULL 字符作为引号时:

csv_fwrite2 (fp, src, src_size, '\0'); `

不是将 src 的内容作为字符串写入文件,而是输出如下:

006e 616d 6500 2c00 6167 6500 2c00 6765

而不是:name,age,gender

有什么想法吗?

【问题讨论】:

  • while (src_size) { if (*csrc == quote) { if (fputc(quote, fp) == EOF) ... } if (fputc(*csrc, fp) == EOF) ... } 不打印quote 两次?
  • 您使用什么程序/工具查看文件的输出?
  • 提示:“NULL”最好保留用于标识 空指针常量 NULL。对于空字符,使用'\0'空字符
  • 6e 616d 6500 确实是“名称”。但是由于不可读的字符,您的编辑器将其作为二进制文件打开。
  • 它的输出十六进制正确吗?由于它是一个特殊字符,所以没有什么可以让空字符出现吗?

标签: c file byte buffer


【解决方案1】:

我认为它是您所期望的文件,但它作为十六进制转储而不是作为文本加载到您的编辑器中,因为 '\0' 是一个特殊字符。

【讨论】:

  • 那么有什么办法可以保留 '\0' 但不能将值加载为十六进制?我需要支持不同类型的引号(双引号、单引号和空引号)
  • 引号、逗号、句点是可读字符。 \0 不是。因此,您可以保留在文件中。只需删除\0,除非您有特定理由保留它们
  • @AjayBrahmakshatriya 我必须保留空字符,因为显然有些文件使用空字符作为引号,我必须支持任何文件:(
猜你喜欢
  • 1970-01-01
  • 2013-02-13
  • 2013-12-11
  • 1970-01-01
  • 2017-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多