2010-07-13 13 views
2

Pouvez-vous définir un index de tableau comme index de départ i.e où lire à partir du fichier? J'avais peur que le tampon puisse être corrompu dans le processus.Lire le fichier dans le tableau ligne par ligne

#include <stdio.h> 

int main() 
{ 
    FILE *f = fopen("C:\\dummy.txt", "rt"); 

    char lines[30]; //large enough array depending on file size 

    fpos_t index = 0; 

    while(fgets(&lines[index], 10, f)) //line limit is 10 characters 
    { 
     fgetpos (f, &index); 
    } 

    fclose(f); 
} 

Répondre

0

lines[index] est le caractère du tableau indice-ième lines. Son adresse n'est pas la ligne index'th.

Si vous voulez passer à une ligne particulière, disons 5, alors pour lire la 5ème ligne, lisez 4 lignes et ne faites rien avec elles, elles lisent la ligne suivante et font quelque chose avec.

Si vous devez passer à un fichier BYTE particulier dans un fichier, vous devez utiliser fseek(). En outre, veillez à ce que le nombre d'octets que vous souhaitez lire pour vous (10) corresponde à la taille de la ligne dans laquelle vous placez la ligne (30). Ce n'est donc pas le cas à présent.

Si vous avez besoin de lire une partie d'une ligne à partir d'un certain caractère dans cette ligne, vous devez toujours lire toute la ligne, puis choisissez d'en utiliser un morceau à partir d'un endroit autre que le début. Ces deux exemples sont comme demander une partie d'un document d'un site Web ou d'une bibliothèque - ils ne vont pas arracher une page pour vous, vous obtenez le document entier, et vous devez retourner à ce que vous vouloir.

0

Pas comme ça. Il existe une fonction appelée fseek qui vous amènera à un emplacement différent dans le fichier.

Votre code lira le fichier dans une partie différente du tampon (plutôt que de lire une partie différente du fichier).

1

Vous pouvez, mais depuis votre code essaie de lire tout le contenu du fichier, vous pouvez le faire beaucoup plus directement avec fread:

char lines[30]; 

// Will read as much of the file as can fit into lines: 
fread(lines, sizeof(*lines), sizeof(lines)/sizeof(*lines), f); 

Cela dit, si vous voulez vraiment lire ligne par ligne et faites-le en toute sécurité, vous devriez changer votre ligne de fgets à:

// As long as index < sizeof(lines), guaranteed not to overflow buffer 
fgets(&lines[index], sizeof(lines) - index, f);