【发布时间】: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确实是“名称”。但是由于不可读的字符,您的编辑器将其作为二进制文件打开。 -
它的输出十六进制正确吗?由于它是一个特殊字符,所以没有什么可以让空字符出现吗?