PDA

Visualizza la versione completa : [C-Stringhe] Modificare parte di una stringa in un file di testo


AdaByron
24-08-2010, 18:57
Salve, sono nuova del forum ed ho un piccolo problema da risolvere.
Ho un file di testo costituito da diverse righe e ho bisogno di modificare in una di quest'ultime una parola senza intaccare il resto del file.
Ho giÓ provato ad usare l'istruzione memmove ma mi sovrascrive parte della riga successiva. Cosa posso fare? Avete suggerimenti?
Grazie

simo_85
24-08-2010, 21:16
EDIT..
Se non mi sbaglio, puoi registrare la posizione nel file aiutandoti con la lseek o la fsetpos per dove inizia e dove finisce la parola, cosi rimpiazzarla con la parola da te scelta ed eventualmente gestire il numero di caratteri..
Cmq posta il codice.

AdaByron
24-08-2010, 21:39
Allora ti spiego un p˛ tutto il codice, io cerco una stringa nel file acc la modifico e la scrivo nel file valff
#include <stdlib.h>
#include "string.h"
#include <stdio.h>
#include <ctype.h>

#define MAX_DIM 2048

int main (void){
FILE *acc, *valff;
char line[MAX_DIM], tipo[MAX_DIM], OriginalVine[MAX_DIM];
const char doc[] = "DOC: ";
const char vine[] = "(Vinificazione (tipo ";
int i, j, Vinificazione = 0, p;

acc = fopen ("accepted", "r");
if (!acc){
printf ("It is impossible to open the file Input.\n");
exit (1);
}
valff = fopen ("valfacts", "r+t");
if (!valff){
printf ("It is impossible to open the file Input.\n");
exit (1);
}
while ((fgets(line, sizeof(line), acc) != NULL) && (Vinificazione != 1)) {
if (strstr(line, doc) != NULL) {
i = strstr(line, doc) - line;
Vinificazione = 1;
break;
}
}
for (j = 0, i = (i + sizeof(doc)-1); j == sizeof(tipo), line[i] != '<'; j++, i++){
if (line[i] == ' ')
if(isalpha(line[i + 1]))
tipo[j] = '_';
else break;
else tipo[j] = line[i];
}
for (j; j != 0; j--){ /*rendo tutto minuscolo il contenuto di tipo*/
if (isupper(tipo[j]))
tipo[j] = tolower(tipo[j]);
}

while (fgets(line, sizeof(line), valff) != NULL) {
p = ftell(valff) - strlen(line); //posizione dell'ultima riga letta
if (strstr(line, vine) != NULL) {
i = strstr(line, vine) - line;
break;
}
}
for (j = 0, i = (i + sizeof(vine)-1); j == sizeof(OriginalVine), line[i] != ')'; j++, i++)
OriginalVine[j] = line[i];
char * OriginalVinePtr = strstr (line, OriginalVine);
char * NextVinePtr = strstr (line, OriginalVinePtr + strlen (OriginalVine));
const size_t aNewVineLength = strlen (tipo) - strlen (OriginalVine);
const size_t aOldVineLength = strlen (OriginalVinePtr);
strcat (tipo, NextVinePtr);
memmove (OriginalVinePtr + aNewVineLength, OriginalVinePtr + aOldVineLength, strlen(tipo));
memmove (OriginalVinePtr, tipo, strlen(tipo));
fseek (valff, p, SEEK_SET);
fputs(line, valff);
fclose(acc);
fclose(valff);
return 0;
}

simo_85
25-08-2010, 02:57
Vedi qui (http://www.daniweb.com/forums/thread125898.html)
PS: usa i tag codes please.. :cry:

AdaByron
25-08-2010, 11:39
Grazie per la risp,
scusate per i tag codes,
ho guardato il link ma io non devo fare la copia del file di testo originario perchŔ quello mi serve solo per salvarmi una stringa contenuta in esso e quest'ultima andrÓ a sostituire una parola nell'altro file di testo. Fino alla ricerca delle stringhe che mi servono ci arrivo, il mio problema Ŕ la sostituzione nell'ultimo file ovvero in valff perchŔ mi sovrascrive in parte la riga successiva

Loading