Seite 1 von 1

In die Datei reinschreiben.

Verfasst: Fr Feb 03, 2012 9:20 pm
von canlot
Hallo alle zusammen.
Nach ca. einem halben Jahr wieder angefangen mit C und habe schon mein erstes Problem.
Ich will in eine Datei mittendrin was reinschreiben d.h. nicht am Ende und nicht am Anfang.
ich kann mit fseek() die Position bestimmen und wenn ich z.B. mit fprintf() was reinschreiben dann werden die nachfolgenden Inhalte einfach überschrieben. Hat jemand eine Idee wie man es vielleicht schön sauber mit relativ wenig Aufwand hinkriegen könnte?

Re: In die Datei reinschreiben.

Verfasst: Fr Feb 03, 2012 9:21 pm
von cloidnerux
Lese alles bis zum ende, speichere es, schreibe was du schreiben willst und schreibe den rest.

Re: In die Datei reinschreiben.

Verfasst: Fr Feb 03, 2012 9:25 pm
von Kmitska
Hallo,
leider kenn ich mich mit C nicht so aus, aber vielleicht kann ich dir erklären, wie so etwas gehen würde.

Du weisst ja, wo du es reinschreiben möchtest, also würde ich:
- einen string erstellen, mit dem du den ersten Teil bis zum gewünschten Position speicherst
- einen 2. string, worin du dein Text speicherst
- einen 3. string der ab den Punkt den Rest speichert (Also bis: \0)

Und am Ende kannst du sie ja einfach aufbauen (strcat vielleicht?)
string1 + string2 + string3

Grüße,
Kmitska

Re: In die Datei reinschreiben.

Verfasst: Fr Feb 03, 2012 10:01 pm
von Xin
Alles bis zur Position ab der Du schreiben willst ist unkritisch.

fseek zur Position, ab der Du schreiben willst. Von da an musst Du die Daten bis zum Schluss in den Speicher laden. Dann fseekst Du wieder zurück, schreibst die einzufügenden Daten und danach die Daten, die Du dahinter haben möchtest.

Eine "Einfüge"-Operation gibt es nicht.

Re: In die Datei reinschreiben.

Verfasst: Fr Feb 03, 2012 10:28 pm
von canlot
@Kmitska so habe ich mir auch schon gedacht ich habe gehofft das es einfacher ginge.
@Xin ok und wie lese ich sie am besten aus? mit fscanf() vielleicht?

Re: In die Datei reinschreiben.

Verfasst: Sa Feb 04, 2012 11:01 am
von Xin
canlot hat geschrieben:@Kmitska so habe ich mir auch schon gedacht ich habe gehofft das es einfacher ginge.
Schreib Dir eine insert-Routine und gut :-)
Ab diesem Zeitpunkt ist es einfacher.
canlot hat geschrieben:@Xin ok und wie lese ich sie am besten aus? mit fscanf() vielleicht?
Benutze fread() und fwrite().

Wenn Du in gigantischen Dateien arbeitest, dann solltest Du vielleicht in 100k oder 1MB Schritten einlesen und wegschreiben, sonst verbrauchst Du zuviel Speicher.

Re: In die Datei reinschreiben.

Verfasst: Do Feb 09, 2012 10:02 pm
von canlot
Ok ich habe das Programm geschrieben aber es funktioniert nicht wie ich es möchte.
In dem Programm möchte ich eine Stelle suchen auf der eine bestimmte Zeichenfolge zutrifft. Nach der Zeichenfolge möchte ich in das Programm reinschreiben was ich eingegeben habe und dann den Rest der Datei anhängen.
Das ganze ich ein Testprogramm für CGI ;) nur damit ihr bescheid wisst :)

Code: Alles auswählen

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define file_name "test.txt"



int tell_position(char *string, char *search_string)
{
    int counter = 0;
    int counter_inside = 0;
    int size_string = strlen(search_string);

    while(*string != '\0')
    {
        while(*(string+counter) == *(search_string+counter_inside))
        {
            counter++;
            counter_inside++;

            if(*(search_string+counter_inside) == '\0')
                return counter;

            if(*(string+counter) != *(search_string+counter_inside))
            {
                counter -= counter_inside;
            }
        }
        counter++;
    }
    return -1;
}

char *cat_string(char *string, int start_position, int end_position)
{
    char *return_string = malloc((end_position-start_position)*sizeof(char));
    int counter = 0;
    while(start_position <= end_position)
    {
        *(return_string+counter) = *(string+start_position);
        counter++;
        start_position++;
    }
    *(return_string+counter) = '\0';
    return return_string;
}


int main (void)
{
  FILE *file = fopen(file_name, "r");
  long int size;
  char *buffer = NULL;
  char *input = malloc(sizeof(char));
  char *search_string = "<body>";
  char *start_string = NULL;
  char *end_string = NULL;
  int position = 0;
  
  char *whole_string = NULL;

    fseek( file, 0, SEEK_END );
    size = ftell( file );
    fseek( file, 0, SEEK_SET );

    buffer = (char *) malloc( size );

    
      long int read = fread( buffer, sizeof( char ), size-1, file );

      if( read != size - 1 )
      buffer[ read ] = '\0';

    fclose(file);

    fgets(input, 100, stdin);

    position = tell_position(buffer, search_string);
    start_string = cat_string(buffer, 0, position);

    whole_string = malloc(sizeof(char));
    *whole_string = '\0';

    whole_string = start_string;
    strcat(whole_string, input);
    end_string = cat_string(buffer, position, strlen(buffer));
    strcat(whole_string, end_string);



        fopen(file_name, "w+");
        fwrite(whole_string, sizeof(char), strlen(whole_string), file);
        fclose(file);

    return EXIT_SUCCESS;
}