2014-05-13 3 views
-1

Existe-t-il un moyen de vérifier dans Linux C si un fichier est un fichier texte, par ex. UTF ou ASCII? En bash nous avons la fonction file. Y a-t-il un équivalent en C?Vérifiez si un fichier est en texte brut dans C

EDIT: Ceci est ma fonction pour valider un fichier texte en C. J'utilise popen, mais ça ne marche pas très bien. Parfois, j'ai une erreur dans pclose. Qu'est-ce qui aurait besoin d'être édité dans le code?

int check_file(char *path) 
{ 
FILE *file_type; 
char command[] = "/usr/bin/file"; 
char command_to_execute[512]; 
char check[512]; 
int correct = 0; 
sprintf(command_to_execute,"%s %s",command,path); 
file_type = popen(command_to_execute,"r"); 
if(file_type == NULL) 
{ 
    return correct; 
} 
fgets(check,512,file_type); 
char *pointer; 
pointer = strstr(check,"ASCII"); 
if(pointer != NULL) 
    correct = 1; 
pointer = strstr(check,"UTF"); 
if(pointer != NULL)  
    correct = 1;   
pclose(file_type); 
return correct; 
} 
+1

Il existe la bibliothèque 'libmagic' qui est utilisée pour implémenter' file'. –

+2

Lire le fichier et voir s'il contient du texte ou non. –

+0

système ("fichier" + nomfichierfichier); – qulinxao

Répondre

3

file est un programme (pas une fonction bash); vous pouvez lire le fichier et vérifier les caractères non-ascii. Si vous trouvez une sortie false et arrêtez le traitement, si vous atteignez la fin de la sortie de fichier true.

+0

Correct, mais uniquement pour les fichiers ASCII. Même alors: "ASCII" (ou "ascci" comme l'OP le nomme) est un concept glissant. L'espace arrière est-il autorisé? Le flux de formulaire est-il autorisé? CTR + Z est-il une fin de fichier valide (même s'il est suivi d'une brique binaire) ou mène-t-il à un "texte non-simple"? UTF8/UTF16 a des problèmes similaires: vous pouvez prouver qu'il ne contient que des séquences UTF8/UTF16 valides, mais cela ne dit rien en soi. (Bien que l'inverse - une séquence * invalide * - prouve qu'il ne s'agit pas d'un fichier texte.) – usr2564301

0

Vous pouvez utiliser libicu pour tester si une chaîne correspond à un certain codage. Iconv est une autre alternative

Questions connexes