Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

    [C-Stringhe] Modificare parte di una stringa in un file di testo

    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

  2. #2
    Utente di HTML.it
    Registrato dal
    Jul 2010
    Messaggi
    466
    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.

  3. #3
    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;
    }

  4. #4
    Utente di HTML.it
    Registrato dal
    Jul 2010
    Messaggi
    466
    Vedi qui
    PS: usa i tag codes please..

  5. #5
    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

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.