007
08.08.2004, 20:31 Uhr
Pablo
Supertux (Operator)
|
Ok, meins ist ein bisschen groß geworden, aber gibt alle Zeilen in der richtigen Reihenfolge aus, wenn man supercat 5-3 bla.txt macht, dann werden die Zeilen 3 5 und 5 in dieser Reihenfolge ausgebeben
C++: |
/* fun-soft.de Rätsel super cat Synopsis:
Zu schreiben ist ein Programm zeilenausg welches bestimmte Zeilen einer Datei ausgibt. Bsp. (test ist die zu ausgebende Datei) $ zeilenausg 3,4-9,12,14- test Gibt Zeile 3,4 bis 9,12 und 14 bis zum Ende aus
$ zeilenausg 2-10 test Gibt Zeile 2-10 aus
$ zeilenausg -20,50- test Gibt Zeile 1 bis 20 aus und 50 bis Ende
$ zeilenausg test Gibt alle Zeilen aus
*/
#include <stdio.h> #include <stdlib.h> #include <stdarg.h> #include <string.h>
#define MAX_LENGTH 4096 #define FM_A_B 1 #define FM_A_ 2 #define FM__A 3 #define FM_A 4 #define FM_ERROR 5
int comp(const void* z1, const void* z2) { return( *(int *)z1 - *(int *)z2 ); }
void fehl_meldung(const char *fmt, va_list az) { char puffer[MAX_LENGTH];
vsprintf(puffer, fmt, az); fprintf(stderr, "%s", puffer); }
void error(const char *fmt, ...) { va_list az;
va_start(az, fmt); fehl_meldung(fmt, az); va_end(az); exit(1); }
void print_lines(const char* filename, size_t len, int* lines, int eof) { char buffer[MAX_LENGTH]; FILE* file; int counter=0, current=0;
if (NULL==(file = fopen(filename, "r"))) { free(lines); error("File '%s' cannot be opened\n", filename); }
while(fgets(buffer, MAX_LENGTH, file) && ++current) { //printf("Printing counter=%d %s", counter, buffer); if(counter<len) { /* man kann in lines lesen */ if(lines[counter]!=current) buffer[0]=0; else counter++;
} else if(!eof) buffer[0]=0;
printf("%s", buffer); }
}
int type(const char* arg, int* x, int* y) { if (sscanf(arg, "%d-%d", x, y)==2) return FM_A_B; if (sscanf(arg, "%d-", x)==1 && arg[strlen(arg)-1]=='-') return FM_A_; if (sscanf(arg, "-%d", x)==1 && arg[0]=='-') return FM__A; if (sscanf(arg, "%d", x)==1) return FM_A;
return FM_ERROR; }
void prepare_lines(int** lines, int flag, int x, int y, size_t* len, int* eof) { int* tmp; if (flag==FM_ERROR) return; int bereich; /* anzahl der neue Felder in *lines */ int i; switch(flag) { case FM_A_B: bereich = abs(x-y)+1; if (y<x) { x ^= y; y ^= x; x ^= y; } break; case FM_A_: bereich = 1; *eof |= 1; break; case FM__A: bereich = x; x=1; break; case FM_A: bereich = 1; break; case FM_ERROR: default: error("The format is incorrect\n"); }
if (!*len) { /* speicher initialisieren */ tmp = (int*) malloc(sizeof(int)*bereich); if (!tmp) error("Not enough memory\n");
} else { /* speicher vergrößern */ tmp = *lines; realloc(tmp, sizeof(int) * (*len+bereich)); }
for(i=0; i<bereich; ++i) tmp[*len+i] = x+i;
*len += bereich; *lines = tmp;
}
int parse_argv(int argc, char** argv, int** lines, size_t* len, int* eof) { int x,y,typ; char* token;
if (argc==2) { /* Verhalten von cat */ *len=0; *eof=1; return 1; }
*len = 0; *eof = 0;
token = strtok(argv[1], ",");
typ = type(token, &x, &y); prepare_lines(lines, typ, x,y,len,eof);
while (NULL != (token=strtok(NULL, ","))) { typ = type(token, &x, &y); prepare_lines(lines, typ, x,y,len,eof); }
return 2; }
int main(int argc, char** argv) { int* lines, eof, filename; size_t len;
if (argc==1) error("usage: %s [lines] textfile\n\ [line]\t\tThe format of the lines. 3,4-9,12,14- means\n\ \t\trow 3, row 4 to 9, row 12, row 14 to eof. Format -3 means\n\ \t\trow 1 to 3\n", argv[0]);
filename = parse_argv(argc, argv, &lines, &len, &eof);
/* array sortieren */ qsort(lines, len, sizeof(int), comp);
print_lines(argv[filename], len, lines, eof);
free(lines);
return 0; }
|
-- A! Elbereth Gilthoniel! silivren penna míriel o menel aglar elenath, Gilthoniel, A! Elbereth! Dieser Post wurde am 08.08.2004 um 20:33 Uhr von Pablo editiert. |