Lire et écrire dans un fichier txt?

Discussion dans 'Développement d'un site Web ou d'une appli mobile' créé par tryan, 29 Avril 2010.

  1. tryan
    tryan WRInaute passionné
    Inscrit:
    20 Février 2005
    Messages:
    2 239
    J'aime reçus:
    0
    Bonjour,

    Je me pose quelques questions sur la fonction fopen() et compagnie !

    Pourquoi ne peut on pas écrire puis lire un fichier .txt si on ne ferme pas la connexion juste après l'écriture?

    Un exemple qui ne fonctionne pas :
    Code:
    <?php
    $fichier_a_ouvrir = fopen ("b.txt", "a+");
    //on écrit dans le fichier
    fwrite($fichier_a_ouvrir,"Bonjour et bienvenue :)!<br/>");
    //on lit tout
    while (!feof($fichier_a_ouvrir)) {
    $ligne = fgets($fichier_a_ouvrir, 1024);
    // le echo ne retourne rien
    echo $ligne;
    }
    fclose ($fichier_a_ouvrir);
    ?>
    Un exemple qui fonctionne :
    Code:
    <?php
    $fichier_a_ouvrir = fopen ("b.txt", "a+");
    fwrite($fichier_a_ouvrir,"Bonjour et bienvenue :)!<br/>");
    //Ici je ferme puis ré ouvre la connexion pour lire le contenu du fichier
    fclose ($fichier_a_ouvrir);
    $fichier_a_ouvrir = fopen ("b.txt", "a+");
    while (!feof($fichier_a_ouvrir)) {
    $ligne = fgets($fichier_a_ouvrir, 1024);
    echo $ligne;
    }
    fclose ($fichier_a_ouvrir);
    ?>
    
    A quoi sert exactement le chiffre "1024" dans la fonction fgets() ?
    Exemple :
    Code:
    <?php
    $fichier_a_ouvrir = fopen ("b.txt", "r");
    $contenu_du_fichier = fgets ($fichier_a_ouvrir, 1024);
    fclose ($fichier_a_ouvrir);
    echo $contenu_du_fichier;
    ?>
    J'ai crue comprendre que ce chiffre permet d'afficher le nombre de lettres ... En supposant que mon texte contient 2000 lettres et que j'indique par exemple "150" dans fgets(), ça fonctionne.
    Par contre, si j'indique "2048", seul la première ligne du fichier est lut malgré qu'elle contient moins de 2048 caractères ... Pourquoi la fonction ne passe pas à la ligne suivante pour afficher le reste?

    Autre question ^^ :

    J'ai crus comprendre que le chiffre "1024" indique la première ligne ... Quand est il vraiment ? Quelle chiffre est ton censé mettre si on lit qu'une seule ligne ou l'intégralité d'un fichier ? Je vois du 1024 ou du 4096 dans les tutos. que je trouve ??

    Dernière question :

    Lors de la lecture intégrale d'un fichier et dans la boucle "while", doit on utiliser :
    Code:
    $ligne = fgets($fichier_a_ouvrir, 1024);
    ou
    Code:
    $ligne = fread($fichier_a_ouvrir, 1024);
    ???
    Les 2 affichent le même résultat et je ne vois pas ou est la différence ??

    Merci
     
  2. NextGeneration
    NextGeneration WRInaute occasionnel
    Inscrit:
    27 Septembre 2006
    Messages:
    304
    J'aime reçus:
    0
    fgets($stream, $limit) retourne $limit octets dans le stream $stream jusqu'au prochain symbole EOL (CR/LF ou CR selon ta religion).

    En moins abscons, fgets() retourne une seule ligne de ton fichier, avec une limite (pour éviter de saturer la pile si tu lis une ligne de 1 Mo).

    C'est pourquoi on utilise souvent:

    while($line = fgets($stream, 1024)) {}

    1024 c'est par convention, 1 Ko c'est pratique à travailler.

    Si tu utilises PHP > 5.0, je te conseille d'oublier tout ca et d'utiliser 2 fonctions bien plus pratiques:

    file_get_contents($filename) et file_put_contents($filename, $contents).

    Cf la doc php pour les arguments supplémentaires (contextes de stream, flags de manipulation des EOL).
     
  3. jcaron
    jcaron WRInaute accro
    Inscrit:
    13 Février 2004
    Messages:
    2 595
    J'aime reçus:
    0
    Quand tu accèdes à un fichier, il y a un "pointeur de fichier" qui indique où on lit/écrit. Dans ton premier exemple, tu commences par écrire, donc le pointeur se déplace et est toujours à la fin de ce que tu viens d'écrire. Ensuite, tu lis, mais forcément, tu es à la fin du fichier, donc il n'y a rien à lire. Il faut utiliser fseek pour modifier le pointeur et le ramener au début par exemple (ceci dit, l'intérêt de relire ce que tu viens d'écrire...).

    Note aussi que tu utilises fopen en mode "a+" qui signifie qu'à la base, tu ajoutes à la fin de ton fichier.

    fgets lit toujours une "ligne", avec une limite éventuelle sur la taille de cette ligne. Si tu veux lire exactement X octets, utilise fread (note qu'évidemment fread peut te renvoyer moins que X si tu es à la fin du fichier par exemple).

    Si tu fais une lecture intégrale et que tu te moques de la structure du fichier (i.e. tu n'as pas besoin de le découper en lignes), le résultat est effectivement le même dans les deux cas, mais sur un fichier texte par exemple (i.e. qui contient des lignes plus courtes que la taille max donnée), ça va faire plus d'appels avec fgets qu'avec fread.

    Il est temps d'aller lire la doc :)

    Jacques.
     
  4. tryan
    tryan WRInaute passionné
    Inscrit:
    20 Février 2005
    Messages:
    2 239
    J'aime reçus:
    0
    Merci à vous pour ces explications :D et si je pose la question ici, c'est bien parce que je n'ai pas tout comprit en lisant php.net ^^!
     
Chargement...
Similar Threads - Lire écrire fichier Forum Date
Lire les emails après une sauvegarde d'un dédié Administration d'un site Web 17 Avril 2017
L'IA de Google sait mieux lire sur les lèvres que les experts humains Google : l'entreprise, les sites web, les services 24 Novembre 2016
[résolu] Sessions : lire le contenu alors qu'on ne sait pas comment il est nommé... Développement d'un site Web ou d'une appli mobile 25 Mai 2016
Comment lire un fichier SQL Développement d'un site Web ou d'une appli mobile 25 Août 2015
Impact référencement sur texte qui se déploie ou non (exemple "lire la suite") Débuter en référencement 14 Avril 2015
Comment lire le serps? Référencement Google 17 Décembre 2014
Impossible de lire les retweet. Suis désespérée. Aidez moi + Merci Twitter 13 Décembre 2013
lien: listing,article, Lire la suite, hn... Débuter en référencement 24 Mai 2013
Texte caché du type "lire plus" Débuter en référencement 30 Avril 2013
Lire une image depuis une base de donnée (je stockais l'url de l'image de type text) Développement d'un site Web ou d'une appli mobile 6 Avril 2013
  1. Ce site utilise des cookies. En continuant à utiliser ce site, vous acceptez l'utilisation des cookies.
    Rejeter la notice