2017-08-04 3 views
1

J'ai une fonction:caractère NULL changer le fichier de sortie

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; 
} 

Fondamentalement, il prend ce qui est dans src et fournit le contenu src dans un fichier (format csv) et le caractère de citation sera ce que l'argument que vous passe c'est.

par exemple.

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

Dans le fichier de sortie, il contiendra: "name","age","gender"

si:

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

alors la sortie est:

|name|,|age|,|gender|

Tout fonctionne, mais, quand je entrer le caractère NULL comme la citation:

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

Au lieu d'écrire le contenu de src dans le fichier sous forme de chaînes, la sortie est quelque chose comme:

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

au lieu de: name,age,gender

Toute pensée?

+0

Does not 'while (src_size) { if (* CSRC == citation) { si (fputc (citation, fp) == EOF) ...} si (fputc (* CSRC, fp) == EOF) ... } 'print' quote' deux fois? – chux

+1

Quel programme/outil avez-vous utilisé pour voir la sortie du fichier? – chux

+0

Astuce: "NULL" est le mieux réservé pour identifier le _null pointeur constant_ 'NULL'. Pour le _null character_, utilisez ''\ 0'' ou _null character_. – chux

Répondre

4

Je pense que c'est le fichier, vous vous attendez, mais il est chargé en tant que vidage hexadécimal et non en tant que texte dans votre éditeur, car '\0' est un caractère spécial.

+0

Alors, y a-t-il quelque chose qui peut être fait pour garder le '\ 0' mais ne pas avoir les valeurs à charger en hexadécimal? Je dois prendre en charge différents types de guillemets (guillemets, guillemets simples et guillemets) –

+0

guillemets, virgules, les points sont des caractères lisibles. '\ 0' ne l'est pas. Donc, ceux que vous pouvez conserver dans le fichier. Il suffit de supprimer le '0 ', sauf si vous avez des raisons spécifiques pour les garder –

+0

@ AjayBrahmakshatriya Je dois garder le caractère nul car apparemment certains fichiers utilisent des caractères Null comme guillemets et je dois supporter n'importe quel fichier :( –