2013-10-11 2 views
0

Je souhaite lire les données du fichier dans une chaîne.Lecture d'un fichier en tant que chaînes

Existe-t-il une fonction qui lit le fichier entier dans une matrice de caractères? Je ouvrir le fichier comme ceci:

FILE *fp; 

for(i = 0; i < filesToRead; i++) 
{ 
    fp = fopen(name, "r"); 

    // Read into a char array. 
} 

EDIT: Alors, comment le lire "ligne par ligne" getchar()?

+1

Sauf si vous en écrivez une. Vous devrez lire chaque fichier ligne par ligne – Pankrates

+1

Bien sûr, [memmap] (http://pubs.opengroup.org/onlinepubs/009695399/functions/mmap.html) le fichier et vous pouvez y accéder en tant que tableau. –

+0

Comment le lire ligne par ligne? Ou voulez-vous dire char par char? –

Répondre

2

Voici trois façons de lire un fichier entier dans un tampon contigu:

  1. Figure la longueur du fichier, puis fread() le fichier entier. Vous pouvez déterminer la longueur avec fseek() et ftell(), ou vous pouvez utiliser fstat() sur les systèmes POSIX. Cela ne fonctionnera pas sur les sockets ou les tuyaux, cela ne fonctionne que sur des fichiers réguliers.

  2. Lisez le fichier dans un tampon que vous développez dynamiquement lorsque vous lisez des données à l'aide de fread(). Les implémentations typiques commencent avec une taille de tampon "raisonnable" et le doublent chaque fois que l'espace est épuisé. Cela fonctionne sur n'importe quel type de fichier.

  3. Sur POSIX, utilisez fstat() pour obtenir le fichier, puis mmap() pour mettre le fichier entier dans votre espace d'adressage. Cela ne fonctionne que sur des fichiers réguliers.

+0

Oui, je prévois d'utiliser fstat() pour allouer la taille du tableau avant de le lire. Cependant, obtenir les données du fichier est un mystère pour moi. –

+0

@MikeJohn: Oui, utilisez 'fread()'. Voir # 1 ci-dessus. –

+0

@Mike John Ceci est la façon de lire le fichier entier. Un fichier peut contenir des octets '\ 0', donc considérez que si vous voulez utiliser des" chaînes "terminées par \ 0. Pensez aussi à ouvrir le fichier en binaire: "rb". – chux

0

Vous pouvez effectuer les opérations suivantes:

FILE *fp; 
int currentBufferSize; 

for(i = 0; i < filesToRead; i++) 
{ 
    fp = fopen(name, "r"); 
    currentBufferSize = 0; 
    while(fp != EOF) 
    fgets(filestring[i], BUFFER_SIZE, fp); 

} 

Bien sûr, vous devez faire cela d'une manière plus robuste, vérifier si votre tampon peut contenir toutes les données et ainsi de suite ...

0

Vous pourriez utiliser quelque chose comme ceci: où vous lisez chaque ligne, vérifiez soigneusement le résultat et passez-le à une structure de données de votre choix. Je n'ai pas montré comment allouer correctement la mémoire, mais vous pouvez malloc à l'avant et realloc si nécessaire.

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

#define FILE_BUFFER_SIZE 1024 

int file_read_line(FILE *fp, char *buffer) 
{ 
    // Read the line to buffer 
    if (fgets(buffer, FILE_BUFFER_SIZE, fp) == NULL) 
     return -errno; 

    // Check for End of File 
    if (feof(fp)) 
     return 0; 

    return 1; 
} 

void file_read(FILE *fp) 
{ 
    int read; 
    char buffer[FILE_BUFFER_SIZE]; 

    while (1) { 

     // Clear buffer for next line 
     buffer[0] = '\0'; 

     // Read the next line with the appropriate read function 
     read = file_read_line(fp, buffer); 

     // file_read_line() returns only negative numbers when an error ocurred 
     if (read < 0) { 
      print_fatal_error("failed to read line: %s (%u)\n", 
       strerror(errno), errno); 
      exit(EXIT_FAILURE); 
     } 

     // Pass the read line `buffer` to whatever you want 

     // End of File reached 
     if (read == 0) 
      break; 
    } 

    return; 
} 
+0

bien repéré, fixe – Pankrates

Questions connexes