Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
665 connectés 

  FORUM HardWare.fr
  Programmation
  C

  lseek et methode

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

lseek et methode

n°878141
xiluoc
un pc pour les unirs ....
Posté le 20-10-2004 à 16:25:09  profilanswer
 

: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 ?

mood
Publicité
Posté le 20-10-2004 à 16:25:09  profilanswer
 

n°878502
blurk
Posté le 20-10-2004 à 21:28:52  profilanswer
 

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.

n°878504
Taz
bisounours-codeur
Posté le 20-10-2004 à 21:33:06  profilanswer
 

fais un mappage en mémoire

n°878598
xiluoc
un pc pour les unirs ....
Posté le 21-10-2004 à 00:36:46  profilanswer
 

pas le droit de mapper en memoire justement ;)

n°878602
Taz
bisounours-codeur
Posté le 21-10-2004 à 00:42:03  profilanswer
 

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

n°878619
xiluoc
un pc pour les unirs ....
Posté le 21-10-2004 à 01:42:36  profilanswer
 

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 ?

n°878625
Taz
bisounours-codeur
Posté le 21-10-2004 à 02:15:39  profilanswer
 

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 ?

n°878629
xiluoc
un pc pour les unirs ....
Posté le 21-10-2004 à 02:45:07  profilanswer
 

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
n°878660
cris56
Posté le 21-10-2004 à 08:38:20  profilanswer
 

il sert a rien le (void *)

n°878664
Taz
bisounours-codeur
Posté le 21-10-2004 à 08:50:54  profilanswer
 

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

mood
Publicité
Posté le 21-10-2004 à 08:50:54  profilanswer
 

n°878666
cris56
Posté le 21-10-2004 à 09:00:47  profilanswer
 

...

Citation :

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

n°878822
xiluoc
un pc pour les unirs ....
Posté le 21-10-2004 à 13:26:02  profilanswer
 

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. }

n°878824
Taz
bisounours-codeur
Posté le 21-10-2004 à 13:29:00  profilanswer
 

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

n°878891
xiluoc
un pc pour les unirs ....
Posté le 21-10-2004 à 14:19:48  profilanswer
 


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
n°878917
cris56
Posté le 21-10-2004 à 14:29:58  profilanswer
 

ben si != 1 check feof ?

n°879164
Taz
bisounours-codeur
Posté le 21-10-2004 à 16:48:12  profilanswer
 

RTFM ! on s'en fout du -1 !


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  lseek et methode

 

Sujets relatifs
Mettre un paramètre en méthode POST dans un lien hypertexte[PHP & HTML] Paramètre et méthode GET
executer une methode sur un clic ....[C++] Appel à une méthode récupérée par pointeur
horloge donnant l'heure du serveur. meilleure méthode ?[Java - Servlet] Methode Init() non executee
la methode splitméthode de creation de logiciel embarqué
Appeler la méthode d'une classe par un StringQuelles sont vos méthode pour programmer correctement ?
Plus de sujets relatifs à : lseek et methode


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR