2009-12-27 7 views
0

J'ai un pointeur de fichier que j'utilise avec fgets() pour me donner une ligne complète avec la nouvelle ligne dans le buffer. Je veux remplacer 1 caractère et ajouter un autre caractère avant la nouvelle ligne. Est-ce possible? Par exemple:insérer du texte à l'intérieur d'une ligne

buffer is "12345;\n" 
output buffer is "12345xy\n" 

Voici le code:

buff = fgets((char *)newbuff, IO_BufferSize , IO_handle[i_inx]->fp); 
nptr = IO_handle[i_inx]->fp; 
if(feof(nptr)) 
    { 
      memcpy((char *)o_rec_buf+(strlen((char *)newbuff)-1),"E",1); 
    } 
    else 
    { 
      memcpy((char *)o_rec_buf+(strlen((char *)newbuff)-1),"R",1); 
    } 

Comme vous pouvez le voir ici (exemple de ligne est indiqué ci-dessus) Je remplace la nouvelle ligne. Je veux insérer le texte et conserver la nouvelle ligne au lieu de ce que je fais ci-dessus.

+0

Montrez-nous du code et le problème que vous rencontrez. Ce que vous dites est très possible. Cependant, le manque de contexte approprié ne nous aidera pas à vous aider. – dirkgently

+0

Pourquoi les moulages sont-ils nécessaires? Quel est le type de 'newbuff' et' o_rec_buff' qui les rend nécessaires? Vous devriez éviter les jets à moins qu'ils ne soient nécessaires, et il est loin d'être évident pourquoi ils seraient nécessaires. De même, le test '' if (feof (nptr)) ''est une importation de Pascal-think. Vous devriez tester la valeur de retour de 'fgets()'. Notez également que le contenu de la mémoire tampon n'est pas défini si l'appel de 'fgets()' échoue - cela signifie que vous ne pouvez pas vous fier à quelque chose de sain. (Ce sera probablement la même chose qu'avant l'échec de l'appel, mais vous ne pouvez pas vous en fier.) –

Répondre

3

Vous ne pouvez pas insérer un caractère comme vous le souhaitez. Si vous êtes sûr que l'o_rec_buf a assez d'espace, et que la ligne se terminera toujours ";\n", alors vous pouvez faire quelque chose comme:

size_t n = strlen(newbuff); 
if (n >= 2) 
    strcpy(o_rec_buf + n - 1, "E\n"); 
    /* memcpy(o_rec_buf+n-1, "E\n", 3); works too */ 

Notez que l'utilisation feof() comme la façon dont vous faites est une erreur la plupart du temps . feof() vous indique si vous avez atteint la condition de fin de fichier sur un fichier après vous l'avez touché. Si vous exécutez le code ci-dessus dans une boucle, lorsque feof() renvoie 'true', aucune ligne ne sera lue par fgets et buff sera NULL, mais newbuff sera inchangé. En d'autres termes, newbuff contiendra les données du dernier appel fgets. Vous allez traiter la dernière ligne deux fois. Voir CLC FAQ 12.2 pour plus, et une solution.

Enfin, pourquoi tous les moulages? Sont o_rec_buf et newbuff pas du type char *?

1

Si le tampon a suffisamment d'espace, vous devez déplacer la bande-annonce d'un caractère, en utilisant memmove et mettre à jour le caractère dont vous avez besoin. Assurez-vous de ne pas oublier de mémoriser le '\ 0' final.