2017-10-20 16 views
0

J'ai fait un programme qui ouvre les fichiers et les recherches pour un motC Ouverture d'un fichier pour vérifier si elle est binaire, le cas échéant l'imprimer est binaire

Je veux travailler uniquement sur des fichiers texte

est-il un moyen fourni par C pour vérifier si un fichier est BINARY, et si oui, je veux quitter le programme avant que les opérations se déroulent

Merci

+0

Cela dépend de votre définition de binaire. Vérifiez chaque octet dans le fichier isalphanum() ou juste s'il y en a> 127? –

+0

Tous les fichiers sont binaires. MS a la distinction en raison des fins de ligne –

+0

Vérification de la fin du fichier ne fera pas l'affaire? Alternativement, vous pouvez vérifier les octets pour la gamme ASCII de caractères imprimables. – Tob

Répondre

1

non, il n'y a pas, parce qu'il est impossible dire à coup sûr. Si vous attendez un encodage spécifique, vous pouvez vérifier vous-même si le contenu du fichier est valide dans cet encodage, par ex. Si vous attendez ASCII, tous les octets doivent être < = 0x7f. Si vous attendez UTF-8, c'est un peu plus compliqué, see a description of it. Dans tous les cas, il n'y a aucune garantie qu'un fichier "binaire" ne ressemble pas accidentellement à un fichier valide dans un encodage de texte donné. En fait, le terme "fichier binaire" n'a pas beaucoup de sens, car tous les fichiers contiennent des données binaires.

+0

À l'heure actuelle, cela semble fonctionner, je ne m'attends pas à travailler sur des symboles spéciaux. J'essaye de produire un programme qui fonctionne comme GREP sur Linux. Merci! –

1

Ce n'est pas le fichier en soi qui est binaire ou texte; il s'agit juste de la façon dont vous interprétez le contenu du fichier lors de son ouverture. Vous pouvez interpréter un fichier contenant uniquement du texte en tant que binaire, évitant ainsi qu'un /r/n puisse être traduit en /n uniquement; Et vous pouvez ouvrir un fichier contenant des données brutes comme, par exemple, un bitmap en utilisant un mode texte, corrompant ainsi probablement le contenu en ce qu'un 0x0D 0x0A est converti en un 0x0D seulement.

Vous ne pouvez donc pas vérifier le fichier en soi, mais vous pouvez ouvrir le fichier en mode binaire et voir si le contenu contient quelque chose que vous n'interprétez pas en tant que texte.

1

Si nous partons du principe que par le texte que vous entendez ASCII et non UTF-8, vous pouvez le faire en lisant chaque personnage et en utilisant isascii() et isspace() pour vérifier si elle est un caractère valide:

void is_text(char *filename) { 
    FILE *f = fopen(filename, "r"); 
    if (!f) { 
     perror("fopen failed"); 
     return; 
    } 
    int c; 
    while ((c=fgetc(c) != EOF) { 
     if ((!isascii(c) || iscntrl(c)) && !isspace(c)) { 
      printf("is binary\n"); 
      fclose(f); 
      return; 
     } 
    } 
    printf("is text\n"); 
    fclose(f); 
} 

Si la fichier contient des caractères UTF-8, il devient plus compliqué que vous devez regarder plusieurs octets à la fois et voir si elles sont des séquences d'octets UTF-8 valides. Il y a aussi la question de savoir quels points de code Unicode sont considérés comme du texte.

+0

J'essaie d'émuler le fonctionnement de GREP sous Linux, je ne pense pas que cela fonctionne sur les caractères Unicode donc je ne pense pas que ce sera un problème. Merci de votre aide! –