141 votes

Objective-C : Lecture d'un fichier ligne par ligne

Quelle est la manière appropriée de traiter les gros fichiers texte en Objective-C ? Disons que je dois lire chaque ligne séparément et que je veux traiter chaque ligne comme une NSString. Quelle est la manière la plus efficace de le faire ?

Une solution consiste à utiliser la méthode NSString :

+ (id)stringWithContentsOfFile:(NSString *)path 
      encoding:(NSStringEncoding)enc 
      error:(NSError **)error

puis diviser les lignes avec un séparateur de nouvelle ligne, et enfin itérer sur les éléments du tableau. Cependant, cela semble assez inefficace. N'y a-t-il pas un moyen simple de traiter le fichier comme un flux, en énumérant chaque ligne, au lieu de tout lire en une seule fois ? Un peu comme le java.io.BufferedReader de Java.

0voto

sooop Points 66

D'après la réponse de @Adam Rosenfield, la chaîne de formatage de fscanf serait modifié comme ci-dessous :

"%4095[^\r\n]%n%*[\n\r]"

il fonctionnera dans les terminaisons de ligne osx, linux, Windows.

-2voto

Chris Points 13472

Voici une solution simple que j'utilise pour les petits fichiers :

NSString *path = [[NSBundle mainBundle] pathForResource:@"Terrain1" ofType:@"txt"];
NSString *contents = [NSString stringWithContentsOfFile:path encoding:NSASCIIStringEncoding error:nil];
NSArray *lines = [contents componentsSeparatedByCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"\r\n"]];
for (NSString* line in lines) {
    if (line.length) {
        NSLog(@"line: %@", line);
    }
}

-7voto

abhi Points 23

Utilisez ce script, il fonctionne très bien :

NSString *path = @"/Users/xxx/Desktop/names.txt";
NSError *error;
NSString *stringFromFileAtPath = [NSString stringWithContentsOfFile: path
                                                           encoding: NSUTF8StringEncoding
                                                              error: &error];
if (stringFromFileAtPath == nil) {
    NSLog(@"Error reading file at %@\n%@", path, [error localizedFailureReason]);
}
NSLog(@"Contents:%@", stringFromFileAtPath);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X