Question

J'ai du code C qui devrait imprimer tout le contenu d'un fichier.Le programme imprime auparavant très bien un fichier, mais lorsqu'il en imprime une seconde, je continue de voir un caractère Unicode là où il ne devrait certainement pas y en avoir.

int c = fgetc(file);
putchar((!isprint(c) ? : c));

(enveloppé dans un while(!feof(file)))
Ne devrait imprimer que les caractères imprimables ASCII, sauf erreur de ma part.Quoi qu'il en soit, la première chose qu'il imprime est \357\277\275, qui n'est pas ASCII et n'est pas imprimable.

Le fichier contient uniquement ceci : foo+bar.foo+t-bar.foo+completely fake

et il affiche ceci : �foo+bar.foo+t-bar.foo+completely fake (avec une nouvelle ligne entre le personnage étrange et le reste).

Imprimez simplement le tout (à la putchar(c)) met exactement le même caractère à la fin de la ligne.

J'ai même essayé d'utiliser un autre fichier (en renommant l'ancien et en utilisant un lien symbolique vers un autre), mais j'obtiens exactement les mêmes résultats.

Il le fait également si le fichier est vide.

Le fichier est entièrement en texte brut, créé avec vim, et il n'a rien de spécial.

Voici le code d'origine :

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <errno.h>

int main(void)
{
    char *headp = "../include/header";
    char *listp = "../.piclist";
    FILE *head, *list;

    puts("Content-Type: text/html; charset=utf-8\nExpires: 0\n");

    puts("<!DOCTYPE html>\n<html lang='en'>\n<head>");
    puts("\t<title>Foo</title>");
    puts("\t<link rel='stylesheet' href='/css/main.css' />");
    puts("\t<link rel='stylesheet' href='/css/foo.css' />");
    puts("</head>\n<body>");

    head = fopen(headp, "r");
    if (errno) {
            perror("cannot open include/header");
            errno = 0;
    } else {
            while (!feof(head)) putchar(fgetc(head));
            putchar('\n');
    fclose(head);
    }

    list = fopen(listp, "r");
    if (errno) perror("cannot open .piclist");
    else {
    while (!feof(list)) {
            while (!feof(list)) {
                    int c = fgetc(list);
                    putchar((!isprint(c) ? : c));
            }
    }
    fclose(list);
    } /* else */

    fputs("\n<footer>\n\t<hr />\n\t<p>Copyright 2011-2012 the ", stdout);
    fputs("<a href='mailto:foo@example.com'> ", stdout);
    fputs("Foo Bar of Baz</a> of ", stdout);
    fputs("<a href='http://blah.org'>Blah United ", stdout);
    fputs("</a></p>\n</footer>\n</body>\n</html>\n",stdout);

    return 0;
}
Était-ce utile?

La solution

NE PAS UTILISER feof() (du moins pas comme vous l'utilisez)

De plus, votre utilisation de errno est erronée.numéro d'erreur seulement contient une valeur utilisable après qu'une opération ait indiqué un retour d'erreur (principalement par NULL, ou -1 comme valeur de retour)

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <errno.h>

int main(void)
{
    char *headp = "../include/header";
    char *listp = "../.piclist";
    FILE *head, *list;
    int ch;

    puts("Content-Type: text/html; charset=utf-8\nExpires: 0\n");

    puts("<!DOCTYPE html>\n<html lang='en'>\n<head>");
    puts("\t<title>Warrenton Latin School | Gallery</title>");
    puts("\t<link rel='stylesheet' href='/css/main.css' />");
    puts("\t<link rel='stylesheet' href='/css/gallery.css' />");
    puts("</head>\n<body>");

    head = fopen(headp, "r");
    if (!head) {
            perror("cannot open include/header");
            errno = 0;
    } else {
        while (1) {
            ch = fgetc(head);
            if (ch == EOF) break;
            putchar(ch);
            }
        putchar('\n');
        fclose(head);
    }

    list = fopen(listp, "r");
    if (!list) perror("cannot open .piclist");
    else while (1) {
        ch = fgetc(list);
        if (ch == EOF) break;
        putchar((!isprint(c) ? : c));
    }
    fclose(list);

    fputs("\n<footer>\n\t<hr />\n\t<p>Copyright 2011-2012 the ", stdout);
    fputs("<a href='mailto:warrentonlatinschool@gmail.com'> ", stdout);
    fputs("Warrenton Latin School</a> co-op of ", stdout);
    fputs("<a href='http://warrentonumc.org'>Warrenton United ", stdout);
    fputs("Methodist Church</a></p>\n</footer>\n</body>\n</html>\n",stdout);

    return 0;
}

Autres conseils

Ignorer les erreurs possibles dans votre code isprint() considère tous les caractères imprimables, sauf 0x00 - 0x1f et 0x7f.

Des éléments tels que UTF BOM et d'autres caractères en dehors de l'ANSI 7 bits peuvent toujours être imprimés (malgré le fait que leur signification puisse changer en fonction de l'encodage).

Quand vous quittez le 2ème opérateur de ? :vide, il est égal au résultat du conditionnel.Pour les caractères non imprimables, isprintc(c) renvoie 0, donc la partie conditionnelle de l'opérateur trénaire est !0 qui est égal à 1.Par conséquent, putchar tente d'imprimer un caractère ASCII invalide et s'interrompt.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top