2017-08-19 6 views
0

Je souhaite écrire des phrases dans un fichier texte à l'aide de la fonction fwrite. Donc, je dois avoir ces comme arguments de la fonction:Copie d'un tableau de caractères dans un fichier texte

fwrite(const void *restrict buffer, size_t size, size_t count, FILE *restrict stream) 
    tampon
  1. - pointeur vers le premier objet dans le tableau à écrire
  2. taille - taille de chaque objet
  3. nombre - le nombre de objets à écrire
  4. flux - pointeur vers le flux de sortie

Comme le How to dynamically allocate memory space for a string and get that string from user? dit, il est une mauvaise pratique à perdre Mémoire. J'ai lu la réponse et j'ai eu l'idée d'écrire un code à ma façon.

Mon idée est:

  1. pour faire un tableau de caractère et écrire à ses éléments
  2. faire ce tableau de plus en plus en utilisant malloc et realloc
  3. L'écriture continue jusqu'à atteindre le EOF

Malheureusement, je rencontre un problème. Chaque fois que je construire et exécuter le code, il me donne cette erreur:

has stopped working

Heres mon code:

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

int main(void) 
{ 
    size_t index=0,size=1; 
    char ch; 
    FILE *fptr; 
    fptr=fopen("E:\\Textsample.txt","w"); 

    /////////////////Checking/////////////// 
    if(fptr==NULL) 
     { 
      free(fptr); 
      puts("Error occured!\n"); 
      exit(EXIT_FAILURE); 
     } 
    /////////////////Checking/////////////// 

    char *sentence =(char*) malloc(sizeof(char)) ; 
    puts("Plaese write :\n"); 

    while((ch=getchar()) != EOF) 
     { 
      sentence[index]=ch; 
      index++; 
      size++; 
      realloc(sentence,size); 

      /////////////////Checking/////////////// 
      if(sentence==NULL) 
       { 
        printf("Error Occured!\n"); 
        free(sentence); 
        exit(EXIT_FAILURE); 
       } 
      /////////////////Checking/////////////// 

     } 

    //Copying sentnce(s) to the text file. 
    fwrite(sentence,sizeof sentence[0],index,fptr); 
    free(sentence); 
    free(fptr); 
    return 0; 
} 
+0

pinailler: Vous n'êtes pas obligé de libérer un ptr NULL dans le code Checking .. –

+0

"a cessé de travailler"? Quelle? Peut-être exécuter dans un débogueur et voir sur quelle ligne il se bloque. –

+0

@ HennoBrandsma- Que faire si elle ne parvient pas à réaffecter? –

Répondre

2

Vous devez écrire sentence = realloc(sentence, size), je pense.

De plus, il est plus efficace de doubler la taille allouée, chaque fois que nous en avons besoin. Ensuite, nous pouvons en lire autant que nous l'avons déjà lu, donc nous avons besoin de moins de réaffectations. Alors size double (il est la taille de la mémoire tampon allouée, tandis que index garde la trace des caractères de lecture.

Alors

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

int main(void) 
{ 
    size_t index=0,size=1; 
    int ch; 
    FILE *fptr; 
    fptr=fopen("./bla.txt","w"); 

    /////////////////Checking/////////////// 
    if(fptr==NULL) 
    { 
      fprintf(stderr, "Error occured!\n"); 
      exit(EXIT_FAILURE); 
    } 
    /////////////////Checking/////////////// 

    char *sentence = malloc(size) ; 
    puts("Please write, (close with return) :\n"); 

    while((ch=getchar()) != '\n') 
    { 
      sentence[index]=(ch & 0xff); 
      index++;; 
      if (index >= size){ 
        sentence = realloc(sentence,2*size); 

        /////////////////Checking/////////////// 
        if(sentence==NULL) 
        { 
        fclose(fptr); 
        fprintf(stderr, "Error Occured!\n"); 
        free(sentence); 
        exit(EXIT_FAILURE); 
        } 
        /////////////////Checking/////////////// 
        size *= 2; /* update size */ 
      } 
    } 

    //Copying sentence(s) to the text file. 
    fwrite(sentence,1,index,fptr); 
    free(sentence); 
    fclose(fptr); 
    return 0; 

}

qui fonctionne très bien sur mon système.

+0

J'ai fait ce que vous avez mentionné mais ça ne marche toujours pas. –

+0

@Ceeker Essayer avec mon code? –

+0

Merci beaucoup.Il a bien fonctionné. –

0

Vous voulez seulement écrire stdin dans un fichier que vous avez déjà ouvert.Pourquoi ne pas découper l'homme du milieu malloc?

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

int main(void) 
{ 
    int ch; 
    FILE *fptr; 
    fptr=fopen("./bla.txt","w"); 

    /////////////////Checking/////////////// 
    if(fptr==NULL) 
    { 
      fprintf(stderr, "Error occured!\n"); 
      exit(EXIT_FAILURE); 
    } 
    /////////////////Checking/////////////// 

    puts("Please write, (close with return) :\n"); 

    while((ch=getchar()) != '\n') 
    {  
      fputc(ch, fptr); 
    } 
    //if you want the newline too 
    fputc('\n', fptr); 
    fclose(fptr); 
    return 0; 

}