7
votes

Comment lire et écraser le fichier texte en C?

J'ai un fichier texte texte.txt qui se lit (à des fins de simplicité) xxx

à nouveau pour la simplicité, j'essaie simplement de définir le premier caractère de chaque ligne sur "x" , Donc, mon résultat souhaité serait xxx

donc j'ouvre le fichier texte.txt et essaye de remplacer chaque ligne avec la sortie souhaitée dans le même fichier texte. Dans la boucle tandis que j'ai défini le premier personnage de chaque ligne sur 'x'. J'ai également défini la variable "ligne" égale à une, car si elle est sur la première ligne, je souhaite revenir à nouveau au début du fichier afin de remplacer au début au lieu de la fin du fichier. La ligne est ensuite incrémentée de sorte qu'il ignorera le rembobinage de la prochaine itération et devrait continuer à écraser les 2e et 3ème lignes. Cela fonctionne parfaitement pour la première ligne.

Quelqu'un a des solutions? BTW, j'ai étudié cela largement sur Stackoverflow et d'autres sites, et pas de chance. Voici mon code et ma sortie est également ci-dessous: xxx

sortie: xxx


4 commentaires

Vous ne pouvez pas écraser le fichier pendant que vous le lisez. Eh bien, vous pouvez, mais vous avez des données brouillées. Quel est votre système d'exploitation? Si c'est Linux / Unix, supprimez simplement le fichier après l'ouvrir - Unlink ("text.txt"); - ouvrir un fichier nouveau avec le même nom et écrire les lignes modifiées dans le nouveau fichier. Vous aurez deux fichier * variables.


Il doit être positionné au début de la ligne.


La réécriture des fichiers en place est délicate. Un fait un peu connu est que lorsque vous avez lu à l'endroit précis où vous souhaitez commencer à écrire, vous devez appeler quelque chose comme fseek (FP, 0, recherche_cur) < / I> Vous commencez à écrire. Et puis encore une fois que vous avez terminé d'écrire, avant de commencer à lire à nouveau.


Vérifiez toujours (! = NULL) La valeur renvoyée de MALLOC () pour assurer le succès de l'opération. Toujours vérifier (! = null) la valeur renvoyée de fopen () pour assurer l'opération a réussi.


5 Réponses :


6
votes
long pos = ftell(fp);//Save the current position
while (fgets(buffer, 500, fp) != NULL) {
    buffer[0] = 'x';
    fseek(fp, pos, SEEK_SET);//move to beginning of line
    fprintf(fp, "%s", buffer);
    fflush(fp);
    pos = ftell(fp);//Save the current position
}

4 commentaires

@NattachaisuteerApongPan Voir 7.21.5.3 La fonction fopen P7 de N1570.PDF


Je vous connais que votre commentaire a été répondu il y a 2 ans mais je viens de lire votre réponse et je ne suis pas vraiment clair sur "fflush ()". Votre code fonctionne absolument bien, mais j'ai ensuite essayé de supprimer "fflush (fp)" et exécutez le code. Le programme coincé dans une boucle infinie. Depuis que j'ai brisé le programme, il produisit un résultat très étrange. Je n'ai vraiment aucune idée de la raison pour laquelle on ressemble. Pourriez-vous s'il vous plaît aidez-moi à vous expliquer pourquoi retirer FLUSH produit un résultat comme celui-ci. Voici le lien du fichier texte (programme avant et après exécution). drive.google.com/drive/folders/...


@Nattachaisauererapongpan Il est nécessaire d'appeler fflush comme écrit dans le lien indiqué dans le commentaire précédent. Il ne fonctionne pas toujours correctement s'il n'existe pas. Expliqué brièvement, il est tamponné, il doit donc être reflété dans le fichier actuel.


@ Bluepixy merci beaucoup pour votre réponse :) J'ai beaucoup d'idées de votre lien mentionné ci-dessus.



3
votes

Je suggère toujours d'utiliser un autre fichier faire ces solutions KindDA.

  1. Lire la ligne
  2. Mettez x dans un nouveau fichier dans une ligne et la copie du reste de la ligne.
  3. Faites ceci jusqu'à ce que vous obtenez EOF
  4. retirer l'ancien fichier
  5. renommer ce nouveau fichier

0 commentaires

0
votes

Essayez ceci out

#include<stdio.h>
#include<stdio.h>
#include<string.h>
int main()
{
    char buffer[500],read[50][50];
    FILE *fp=fopen("text.txt","r+");
    int line =1;
    while(fgets(buffer,500,fp)!=NULL){
        buffer[0]='x';
        printf("\n%d ",line);
        puts(buffer);
        strcat(read[line-1],(const char*)buffer);
        line++;
    }
    fclose(fp);
    FILE *fp1=fopen("text.txt","w");
    rewind(fp1);
    fprintf(fp1,"%s",read);
    return 0;
    }


0 commentaires

0
votes
// file_overwrite.cpp : main project file.
// File opens and write y value to a file
// again reads same file and re-writes y value to a file

#include "stdafx.h"

using namespace System;

#include<stdio.h>
#include<stdio.h>
#include<string.h>
#include <conio.h>
#include<stdlib.h>

int main(int argc, char *argv[])
{
    int x = 19530;

    FILE *fp1 = fopen("D:\\Data\\BUFF.txt","w+");

    if(fp1 == NULL)
        printf("File not opening \n");
        int y=x;
        fprintf(fp1, "%d \n", y);
        fclose(fp1);
        printf("\n file -> open -> write y value and close");


        freopen("D:\\Data\\BUFF.txt", "w", fp1);
        rewind(fp1);
        y=100;
        fprintf(fp1, "%d \n", y);
        printf("\n file -> Reopen -> rewind write y values and close");
        fclose(fp1);

       getch();
       return 0;
}

1 commentaires

Bien que cela puisse sembler évident, quels sont certains fragments de code, veuillez envisager d'utiliser des commentaires de code ou des références de documentation, lors de la réponse à une question, les gens reçoivent donc des informations générales supplémentaires.



0
votes
// overwrite_file.cpp 
// File opens and write y value to a file
// again reads same file and re-writes y value to a file

#include "stdafx.h"

using namespace System;

#include<stdio.h>
#include<stdio.h>
#include<string.h>                //Include appropriate headers
#include <conio.h>
#include<stdlib.h>

int main(int argc, char *argv[])
{
    int x = 19530;                            // Give any value in the limit

    FILE *fp1 = fopen("D:\\Data\\BUFF.txt","w+");   // open file to write

    if(fp1 == NULL)                                 // if the file pointer encounters a null, it may not open neither overwrite 
        printf("File not opening \n");
        int y=x;                                     
        fprintf(fp1, "%d \n", y);                   //print y
        fclose(fp1);
        printf("\n file -> open -> write y value and close");  // close the file after writing the value of y


        freopen("D:\\Data\\BUFF.txt", "w", fp1);            //reopen and rewind file 
        rewind(fp1);
        y=100;                                              // this value of y given within the limits gets printed on the .exe console
        fprintf(fp1, "%d \n", y);
        printf("\n file -> Reopen -> rewind write y values and close");    // rewind write values and close 
        fclose(fp1);

       getch();
       return 0;
}

0 commentaires