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?
In die Datei reinschreiben.
In die Datei reinschreiben.
Unwissenheit ist ein Segen
- cloidnerux
- Moderator
- Beiträge: 3125
- Registriert: Fr Sep 26, 2008 4:37 pm
- Wohnort: Ram (Gibts wirklich)
Re: In die Datei reinschreiben.
Lese alles bis zum ende, speichere es, schreibe was du schreiben willst und schreibe den rest.
Redundanz macht wiederholen unnötig.
quod erat expectandum
quod erat expectandum
Re: In die Datei reinschreiben.
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
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
- Xin
- nur zu Besuch hier
- Beiträge: 8862
- Registriert: Fr Jul 04, 2008 11:10 pm
- Wohnort: /home/xin
- Kontaktdaten:
Re: In die Datei reinschreiben.
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.
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.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.
Re: In die Datei reinschreiben.
@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?
@Xin ok und wie lese ich sie am besten aus? mit fscanf() vielleicht?
Unwissenheit ist ein Segen
- Xin
- nur zu Besuch hier
- Beiträge: 8862
- Registriert: Fr Jul 04, 2008 11:10 pm
- Wohnort: /home/xin
- Kontaktdaten:
Re: In die Datei reinschreiben.
Schreib Dir eine insert-Routine und gutcanlot hat geschrieben:@Kmitska so habe ich mir auch schon gedacht ich habe gehofft das es einfacher ginge.

Ab diesem Zeitpunkt ist es einfacher.
Benutze fread() und fwrite().canlot hat geschrieben:@Xin ok und wie lese ich sie am besten aus? mit fscanf() vielleicht?
Wenn Du in gigantischen Dateien arbeitest, dann solltest Du vielleicht in 100k oder 1MB Schritten einlesen und wegschreiben, sonst verbrauchst Du zuviel Speicher.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.
Re: In die Datei reinschreiben.
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
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


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;
}
Unwissenheit ist ein Segen