lseek et methode

lseek et methode - C - Programmation

Marsh Posté le 20-10-2004 à 16:25:09    

:hello: ,
j ai un fichier file, je veus retourner la ligne de text corespondante au chifre entre.
 
quel est la bonne methode ? (en low lovel i/o)
je pensais lire le fichier 10 par 10, regarder dans le buffer le char '\n' et  
incrementer un compteur de ligne (\n = nouvelle ligne) ainsi que  SEEK_CUR.
quand le counteur = nombre de ligne voulue, je cherche le '\n' suivant ou l EOF
et j afficher la ligne.
 
En fait c est le coup du buffer[10] y a pas plus simple ?

Reply

Marsh Posté le 20-10-2004 à 16:25:09   

Reply

Marsh Posté le 20-10-2004 à 21:28:52    

Tu pourrais utiliser getline (extension GNU non standard) ou fgets. Au lieu d'un tableau de taille fixe, il faudrait dans les deux cas utiliser malloc et agrandir le buffer avec realloc s'il est trop petit.

Reply

Marsh Posté le 20-10-2004 à 21:33:06    

fais un mappage en mémoire

Reply

Marsh Posté le 21-10-2004 à 00:36:46    

pas le droit de mapper en memoire justement ;)

Reply

Marsh Posté le 21-10-2004 à 00:42:03    

ben émule le alors (une classe qui a la tronche d'un tableau mais qui fait en fait ce qu'il faut) ?
 
Sinon, c'est la peine, il vaut mieux tout charger en ram si c'est faisable, les E/S bas niveau, c'est un appel système à chaque fois, pas de bufferisation, y a pas pire en performance

Reply

Marsh Posté le 21-10-2004 à 01:42:36    

je suis entrain de coder la version simple, mais j ai un bug  
que je narrive pas a deceler
 

Code :
  1. #include <stdio.h>
  2. #include <fcntl.h>
  3. int main()
  4. {
  5.         int i;
  6.         int line_counter;
  7.         int position;
  8.         int input_char;
  9.         char my_read_str[11];
  10.         int my_file_descriptor;
  11.         my_file_descriptor = open ("filestore", O_RDONLY);
  12.         while ((input_char = getchar()) != EOF)
  13.         {
  14.             line_counter = 0;
  15.             position = 0;
  16.             while (read (my_file_descriptor, (void *) my_read_str, 10)!=0)
  17.             // 0 means eof
  18.             {
  19.                 for (i=0; i<10;i++)
  20.                 {
  21.                     if(my_read_str[i]=='\n')
  22.                     {
  23.                          line_counter++;
  24.                     }
  25.                     //  position++;
  26.                     if( line_counter == input_char)
  27.                     {
  28.                         printf("%c",my_read_str[i]);
  29.                     }
  30.                 }
  31.             }
  32.             printf("number of line : %d \n", line_counter);
  33.             lseek (my_file_descriptor, 0, SEEK_SET); //go back to begining       
  34.  
  35.            // printf("Enter line number: " );
  36.         }
  37. }


 
il maffiche deux fois "number of lines : n"
le problem est que apperement il fait une fois la boucle avec le bonne input (2), puis 10 juste apres
le seule moment on j utilise 10 c est quand lis le fichier.
c est un problem de flush stdin ?

Reply

Marsh Posté le 21-10-2004 à 02:15:39    

je te dis de pas utiliser getchar, ni printf, ni rien !
sinon ça sert à quoi de se la jouer bas-niveau ?
 
où alors t'as rien bité et tu ferais mieux d'utiliser partout les FILE* (puisque tu les utilises déjà)
 
 
# !=0)
#             // 0 means eof
 
-> != -1
 
manque un close
 
 
(void *) my_read_str
--> magnifique ...
 
for (i=0; i<10;i++)
--> il se passe quoi si tu as lu moins de 10c ?

Reply

Marsh Posté le 21-10-2004 à 02:45:07    

je me la joue bas niveau par ce qu on nous le demande je vais pas utiliser FILE* ..
pour le (void *) my_read_str  
http://crasseux.com/books/ctutoria [...] ow%20level

A lot of students are asking - can we use scanf, fscanf, getchar, putchar, printf, fprintf, fread, fwrite? The answer is that you can use printf, scanf, gets etc to access stdin and stdout, but you must not use fprintf, fscanf, fgets, etc. Things that you find in section 2 of the unix manual are OK - read, write, open, close, etc. But you must not create any FILE * object. You should be working with file descriptors for disk I/
O.


Message édité par xiluoc le 21-10-2004 à 02:45:53
Reply

Marsh Posté le 21-10-2004 à 08:38:20    

il sert a rien le (void *)

Reply

Marsh Posté le 21-10-2004 à 08:50:54    

c'est con quand même, FILE* ou pas, c'est la même utilisation
 

Citation :

you can use printf, scanf, gets


non, c'est bon j'ai rien dit, tout s'explique

Reply

Marsh Posté le 21-10-2004 à 08:50:54   

Reply

Marsh Posté le 21-10-2004 à 09:00:47    

...

Citation :

but you must not use fprintf, fscanf, fgets, etc.

Reply

Marsh Posté le 21-10-2004 à 13:26:02    

voila ca marche un pb  etait le dernier buffer qui se remplissait apres l eof.
ssize_t est venu a mon secours
 

Code :
  1. #include <stdio.h>
  2. #include <fcntl.h>
  3. #include <unistd.h>
  4. #define BUFFER 256
  5. int main()
  6. {
  7. int i,rd;
  8. int line_counter;
  9. int input;
  10. ssize_t x; //represents the number of bytes actually read
  11. char my_read_str[BUFFER];
  12. int my_file_descriptor;
  13. int readc ; //bool
  14. const int bytes_read=BUFFER;
  15. printf("Enter line number: " );
  16. while (scanf("%d", &input) != -1) //EOF
  17. {
  18.  line_counter = 1; // ligne 1 = begining of file
  19.  my_file_descriptor = open ("filestore", O_RDONLY);
  20.  readc =1;
  21.  while ((x= read (my_file_descriptor, my_read_str, bytes_read*(sizeof(char))) ) && readc== 1)
  22.  { 
  23.   int y = x/(sizeof(char));
  24.   for (i=0; i<y;i++)
  25.   {
  26.    if(my_read_str[i]=='\n'  )
  27.    {
  28.     line_counter++;
  29.    }
  30.    if( line_counter == input)
  31.    {
  32.     if (my_read_str[i] != '\n')
  33.     {
  34.      printf("%c",my_read_str[i]);
  35.     }
  36.    }
  37.   }
  38.   if(line_counter>input) { readc = 0;  } //no need to read the next buffer
  39.  }
  40.  if ( input >= line_counter) printf("Error: not reachable" );
  41.  if ( input<= 0) printf("Error: no 0 or negative ligne possible" );
  42.  printf("\n" );
  43.  lseek (my_file_descriptor, 0, SEEK_SET); //go back to begining         
  44.  close(my_file_descriptor);
  45.  printf("Enter line number: " );
  46. }         
  47. return 0;
  48. }

Reply

Marsh Posté le 21-10-2004 à 13:29:00    

while (scanf("%d", &input) != -1) //EOF
 
 
moi je te fais un != -1 sans EOF quand tu veux
 
 
printf("%c",my_read_str[i]);
printf("\n" );
 
 
/(sizeof(char))
 
ouah balaise comme calcul
putchar spa pour les ienchs

Reply

Marsh Posté le 21-10-2004 à 14:19:48    


moi je te fais un != -1 sans EOF quand tu veux
 
pour le eof comment pourais je faire pour arreter le program avec ctrl D sinon ?


Message édité par xiluoc le 21-10-2004 à 15:05:09
Reply

Marsh Posté le 21-10-2004 à 14:29:58    

ben si != 1 check feof ?

Reply

Marsh Posté le 21-10-2004 à 16:48:12    

RTFM ! on s'en fout du -1 !

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed