2017-08-04 43 views
1

我有一個函數:NULL字符改變輸出文件

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

有什麼想法?

+0

不'而(src_size){ 如果(*中國證監會==報價){ 如果(的fputc(報價,FP)== EOF) ... } 如果(的fputc(*證監會,FP) == EOF) ... }'print'quote' twice? – chux

+1

你用什麼程序/工具查看文件的輸出? – chux

+0

提示:最好保留「NULL」以標識_null指針constant_「NULL」。對於_null character_,使用''\ 0''或_null character_。 – chux

回答

4

我認爲這是你期望的文件,但它被加載爲十六進制轉儲而不是編輯器中的文本,因爲'\0'是一個特殊字符。

+0

那麼有什麼可以做的,以保持'\ 0'但沒有值加載爲十六進制?我需要支持不同類型的引號(雙引號,單引號和空引號) –

+0

引號,逗號,句號是可讀的字符。 '\ 0'不是。所以你可以保留在文件中。只要刪除'\ 0',除非你有特定的理由讓它們保持 –

+0

@AjayBrahmakshatriya我必須保留空字符,因爲顯然有些文件使用空字符作爲引號,我必須支持任何文件:( –