2016-04-17 2 views
-2

Je tente d'ouvrir un fichier (Myfile.txt) et de concaténer chaque ligne dans un seul tampon, mais je reçois une sortie inattendue. Le problème est que mon tampon n'est pas mis à jour avec les dernières lignes concaténées. Il manque quelque chose dans mon code?Chaîne/char * concaténer, C

Myfile.txt (Le fichier à ouvrir et lire)

Good morning line-001: 
Good morning line-002: 
Good morning line-003: 
Good morning line-004: 
Good morning line-005: 
. 
. 
. 

Mycode.c

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

int main(int argc, const char * argv[]) 
{ 
    /* Define a temporary variable */ 
    char Mybuff[100]; // (i dont want to fix this size, any option?) 
    char *line = NULL; 
    size_t len=0; 
    FILE *fp; 
    fp =fopen("Myfile.txt","r"); 
    if(fp==NULL) 
    { 
     printf("the file couldn't exist\n"); 
     return; 
    } 
    while (getline(&line, &len, fp) != -1) 
    { 
     //Any function to concatinate the strings, here the "line" 
     strcat(Mybuff,line); 
    } 
    fclose(fp); 
    printf("Mybuff is: [%s]\n", Mybuff); 

    return 0; 
} 

Am attend ma sortie soit:

Mybuff is: [Good morning line-001:Good morning line-002:Good morning line-003:Good morning line-004:Good morning line-005:] 

Mais, Je reçois une erreur de segmentation (erreur d'exécution) et une valeur de vidage. Tout penser à faire? Merci.

+1

Vous rencontrez un débordement de tampon, avec une limite codée en dur de 100. Utilisez des pointeurs, * indice: realloc * – t0mm13b

+0

@ t0mm13b: Merci pour la relecture, mais toujours le même problème! Mybuff ajouté = realloc (Mybuff, sizeof mybuff), ... pouvez-vous m'aider à pls, iam nouveau au langage C. –

+0

Lisez d'abord [les notes de cours de Cornell] (http://www.cs.cornell.edu/courses/cs2022/2011sp/lectures/lect04.pdf) d'abord! Obtenez le livre K & R aussi. Commencez à partir de là. – t0mm13b

Répondre

0

Spécifiez MyBuff comme pointeur et utilisez l'allocation de mémoire dynamique.

#include <stdlib.h> /* for dynamic memory allocation functions */ 

char *MyBuff = calloc(1,1); /* allocate one character, initialised to zero */ 
size_t length = 1; 

while (getline(&line, &len, fp) != -1) 
{ 
    size_t newlength = length + strlen(line) 
    char *temp = realloc(MyBuff, newlength); 
    if (temp == NULL) 
    { 
      /* Allocation failed. Have a tantrum or take recovery action */ 
    } 
    else 
    { 
      MyBuff = temp; 
      length = newlength; 
      strcat(MyBuff, temp); 
    } 
} 

/* Do whatever is needed with MyBuff */ 

free(MyBuff); 

/* Also, don't forget to release memory allocated by getline() */ 

La volonté ci-dessus à partir des nouvelles lignes MyBuff pour chaque ligne lue par getline(). Je vais laisser les enlever comme un exercice.

Note: getline() est linux, pas standard C. Une fonction comme fgets() est disponible dans la norme C pour les lignes de lecture d'un fichier, mais il n'alloue pas de mémoire comme getline() fait.