CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

Lire un fichier en C/C++

CYBER_BOB
CYBER_BOB
Niveau 10
18 juillet 2004 à 17:43:32

Bonjour,
alors je sais lire un fichier en C/C++, mais uniquement octet par octet, ce qui est une tres mauvaise methode ! !! je voudrais donc lire un fichier mais d´une facon differente, seulement je ne sais pas comment... Est-ce que quelqu´un pourrait m´aider svp ! !!
Merci par avance...
Bob...

Altonfrere
Altonfrere
Niveau 10
18 juillet 2004 à 19:24:04

Euh si tu pouvais préciser un peu plus ca nous aiderait à répondre . ..

quel type de fichier ( texte, binaire) ?
dans quel but ?

La solution la plus courante est de " bufferiser" tes lectures, j´entends par là que tu découpes tes accés disque en lisant N octets dans un buffer que tu traites aussitôt, et tu répétes l´opération. Ne pas oublier de vérifier combien d´octets tu as réellement lu car si la taille du fichier ( ou ce qui reste à lire) est < N faudra en tenir compte . ..

Deuxième possibilité, tu sais quelles sont tes données et tu sais comment elles sont écrites dans le fichier ( par exemple des structures). Alors dans ce cas tu lis les données dans des structures en lisant N octets ( N = la taille d´une structure).

etc...

CYBER_BOB
CYBER_BOB
Niveau 10
18 juillet 2004 à 19:52:20

c´est un fichier texte, et la premiere de tes possibilité est cel ke je voudrai mettre en oeuvre... mais je ne sais pas trop...
tu pourrais pas me sortir un petit code pour me montrer ( uniquement la boucle de lecture)... stp

Altonfrere
Altonfrere
Niveau 10
18 juillet 2004 à 21:01:36

j´ai pas testé mais ca doit donner qqchose comme ca :

  1. define SIZE_BUFFER (1*1024) // 1 Ko

FILE *pFile;
char Buffer[SIZE_BUFFER];
size_t nRead;
size_t nParse;

if ( ! ( pFile = fopen("fichier.txt","rb")) )
{
/ / erreur d´ouverture
/ / sortir . ..
}

while(!feof(pFile))
{
nParse = 0;
nRead = fread(Buffer,sizeof(char),SIZE_BUFFER,pFile);

while(nParse < nRead)
{
// traitement de Buffer de [0;nRead[

nParse++;
}
}

Altonfrere
Altonfrere
Niveau 10
18 juillet 2004 à 21:04:56

fclose(pFile);

:)

CYBER_BOB
CYBER_BOB
Niveau 10
18 juillet 2004 à 22:16:35

ok je regarde ca ! !!
un grand merci a toi ! !!

CYBER_BOB
CYBER_BOB
Niveau 10
18 juillet 2004 à 22:48:40

alors voila je viens de tester ton code, il marche bien mais y a un details qui me perturbe... c´est donc dans la deuxieme boucle while que je met le traitement des données lu...
je cherche donc a affiché le texte lu... il l´affiche bien, mais le texte tel qu´il est dans le fichier est ecrit plein de fois... pourquoi?

CYBER_BOB
CYBER_BOB
Niveau 10
18 juillet 2004 à 22:51:08

j´ai donc enlevé les lignes suivantes:

while(nParse < nRead)
{
/ / traitement de Buffer de [0;nRead[

nParse++;
}

et ca marche bien maintenant ! !!

Altonfrere
Altonfrere
Niveau 10
18 juillet 2004 à 22:55:06

oula alors fallait me dire ca dés le début :)

le buffer quand tu lis les données n´est pas terminé par ´\0´ pour pouvoir être affiché en tant que chaine de caractères, du coup ca affiche le buffer + n´importequoi en mémoire qui suit les données.

Tu peux remplacer le code + haut par :

define SIZE_BUFFER ( 1*1024) / / 1 Ko

FILE *pFile;
char Buffer[SIZE_BUFFER+1]; / / Attention ne pas oublier le +1
size_t nRead;

if ( ! ( pFile = fopen("fichier.txt","rb")) )
{
/ / erreur d´ouverture
/ / sortir . . .
}

while(!feof(pFile))
{
nRead = fread(Buffer,sizeof(char),SIZE_BUFFER,pFile);
if ( nRead)
{
Buffer[nRead] = 0;
printf("%s",Buffer);
}
}
fclose(pFile);

Mais si c´est pour affiche du texte il existe d´autres méthodes pour lire un fichier texte, ligne par ligne etc...

CYBER_BOB
CYBER_BOB
Niveau 10
18 juillet 2004 à 23:09:46

le code que tu m´as donner, il sert a quoi alors?

Altonfrere
Altonfrere
Niveau 10
18 juillet 2004 à 23:23:37

à traiter caractère par caractère le Buffer lu, c´est plus rapide de traiter en mémoire que de lire octet par octer dans le fichier.

Mais tout dépend quel est le but du programme, c´est pour ca que je te demandais plus de précision au début car il existe un paquet de possibilité pour lire un fichier.

CYBER_BOB
CYBER_BOB
Niveau 10
18 juillet 2004 à 23:35:44

ok mais c´est bon, j´ai bien compris maintenant... je te remercie beaucoup ! !!

CYBER_BOB
CYBER_BOB
Niveau 10
19 juillet 2004 à 00:39:21

une derniere question... voila en fait je copie le contenue d´un fichier, dans un autre fichier et le code que j´utilise est celui-ci:

while(!feof(fp_source))
{
nParse = 0;
nRead = fread(buffer, sizeof(char), SIZE_BUFFER, fp_source);
fwrite(buffer, sizeof(char), SIZE_BUFFER, fp_destination);
}

seulement arriver a la fin du fichier, il me copie tout le tableau ( buffer), meme si ce dernier n´est pas remplie... et je ne sais pas comment faire pour empecher ca ! !!

CYBER_BOB
CYBER_BOB
Niveau 10
19 juillet 2004 à 00:41:44

oublie question con ! !!

Altonfrere
Altonfrere
Niveau 10
19 juillet 2004 à 08:36:39

une petite remarque, tu peux virer nParse=0 si tu t´en sers pas, c´était juste pour pouvoir parcourir le buffer en cas de besoin . .. mais apparement tu t´en sers pas . ..

CYBER_BOB
CYBER_BOB
Niveau 10
19 juillet 2004 à 10:50:06

ouais c´est bon en tout cas j´ai appris plein de chose en voyant ce petit bou de code... merci encore ! !!

CYBER_BOB
CYBER_BOB
Niveau 10
19 juillet 2004 à 12:39:08

allé une derniere question car le bout de code la, me sert juste a optimisé mon algorithme si je puis dire...
en fait y a un truc que je ne sais pas du tout faire... je cherche a reperer une chaine de caractere dans le fichier que je suis en train de lire... mais la je ne sais pas du tout comment faire ! !!

Altonfrere
Altonfrere
Niveau 10
19 juillet 2004 à 21:24:58

Bin là c´est une autre histoire . ..

Comme exercice tu pourrais chercher un peu :), non ? Essaie de trouver des infos sur la fonction strstr ( oui oui 2 fois " str") . ..

La méthode de bufferisation que je t´ai indiquée posera problème dans cette recherche car tu peux te retrouver avec un buffer tronqué sur la chaîne que tu recherches ( la lecture s´est arretée au beau milieu de la chaine).

par exemple : ( les [] c´est pour montrer la limite du buffer )

[Un exemple de chai][ne de caractères]

tu te trouves avec dans le buffer lors de la 1ere lecture : " Un exemple de chai"
et à la 2e lecture : " ne de caractères"

si tu cherches le mot " chaine" t´es fichu :)

à toi de trouver comment faire pour éviter ca . ...

lag-it
lag-it
Niveau 10
19 juillet 2004 à 22:06:05

Une fonction très utile : sscanf
Exemple :

- Tu ouvres ton fichier avec fopen(...), classique.
- Tu fait un fgets(...) pour obtenir une ligne de texte que tu places dans un buffer ( variable )
Et si la ligne que tu as récupéré est par exemple :

" Nombre : 3521"

Tu fais :

sscanf( buffer, " Nombre : %d", & ) ;

Pour stocker 3251 dans variable.
En mettant %s, tu dois pouvoir récupérer une chaine, mais je n´ai pas essayé.
Regarde l´aide de ton compilo pour plus d´exemples :)

lag-it
lag-it
Niveau 10
19 juillet 2004 à 22:12:11

http://www.cplusplus.com/ref/cstdio/sscanf.html

Sous forums
  • Aide à l'achat Mac
  • Macintosh
  • Création de Jeux
  • Programmation
  • Création de sites web
  • Linux
  • Internet
  • Steam Deck
  • Hardware
La vidéo du moment