Hier das ganze mal C-kompatibel (Größe: 8150 bytes, Linux Binärdatei, unter Windows wahrscheinlich ~16 KB).
Code:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#define TXTF "input.txt"
#define OUTF "output.txt"
#define FIND "Hans:"
int strpos(FILE *, const char *, unsigned int);
unsigned int readline(FILE *, char *, unsigned int);
int main(void)
{
int pos;
unsigned int len;
char buffer[200];
FILE *fp = fopen(TXTF, "rb");
FILE *fp2 = fopen(OUTF, "wb");
if (fp == 0 || fp2 == NULL) return 0;
if ((pos = strpos(fp, FIND, 0)) == -1) return 0;
fseek(fp, pos, SEEK_SET);
/* folgende Zeile funktioniert auch mit stdin ;) */
len = readline(fp, buffer, sizeof(buffer) - 1);
fwrite(buffer, 1, len, fp2);
fclose(fp);
fclose(fp2);
return 0;
}
int strpos(FILE *fp, const char *find, unsigned int offset)
{
int o = - strlen(find);
int p = ftell(fp);
unsigned int x = 0;
unsigned int len;
char str = 0;
fseek(fp, 0, SEEK_END);
len = ftell(fp);
fseek(fp, offset, SEEK_SET);
for(; offset < len; offset++)
{
fread(&str, 1, sizeof(str), fp);
if (feof(fp) || x == strlen(find)) break;
else if (find[x] != str) x = 0;
else x++;
}
fseek(fp, p, SEEK_SET);
return feof(fp) ? -1 : (int) offset + o;
}
unsigned int readline(FILE *fp, char *buffer, unsigned int sz)
{
unsigned int resp = 0;
char *backup = buffer;
while(*(buffer - 1) != '\n' && *(buffer - 1) != '\r' && --sz)
{
*buffer = fgetc(fp);
if (*buffer == '\r') continue;
buffer++;
resp++;
}
if (backup < buffer) *(buffer - 1) = 0;
return --resp;
}
mfG. BlackBerry