Search in paragraph's text: Difference between revisions
Content added Content deleted
(New post.) |
imported>AldoBaldo No edit summary |
||
Line 184: | Line 184: | ||
substr is extracting only characters after "Traceback" appearance, until the next matching "Traceback" and "SystemError". |
substr is extracting only characters after "Traceback" appearance, until the next matching "Traceback" and "SystemError". |
||
=={{header|C}}== |
|||
<syntaxhighlight lang="c"> |
|||
#include <stdio.h> |
|||
#include <stdlib.h> |
|||
#include <string.h> |
|||
#define INPUT_FILE_NAME "Traceback.txt" |
|||
#define KEYWORD_STRING "SystemError" |
|||
#define TRACEBACK_STRING "Traceback (most recent call last):" |
|||
#define END_OF_PARAGRAPH "\n----------------\n" |
|||
char *load_paragraph( FILE *f ); |
|||
int main() { |
|||
FILE *f = fopen( INPUT_FILE_NAME, "r" ); |
|||
if( f ) { |
|||
char *par = NULL; |
|||
while( (par=load_paragraph(f)) ) { |
|||
if( strstr(par,KEYWORD_STRING) ) { |
|||
char *p = strstr( par, TRACEBACK_STRING ); |
|||
if( p ) printf( p ); |
|||
else printf( "%s\n%s", TRACEBACK_STRING, par ); |
|||
printf( END_OF_PARAGRAPH ); |
|||
} |
|||
free( par ); par = NULL; |
|||
} |
|||
if( !feof(f) ) |
|||
puts( "End of file not reached." ); |
|||
fclose( f ); f = NULL; |
|||
} |
|||
else { |
|||
puts( "Input file not opened." ); |
|||
} |
|||
return 0; |
|||
} |
|||
/*=========================================================================== |
|||
Starting from the current position, looks for the first occurrence of "\n\n" |
|||
in the file f, counting the number of characters from the current position |
|||
to "\n\n" itself (not included) or to the end of the file (whichever occurs |
|||
first). Resets the file to its original position, then returns the number of |
|||
characters. |
|||
If the funtions fails, it returns ((size_t)-1). |
|||
===========================================================================*/ |
|||
size_t get_paragraph_length( FILE *f ) { |
|||
size_t l = ((size_t)-1); |
|||
if( f && !feof(f) ) { |
|||
fpos_t ex_pos; |
|||
if( 0==fgetpos(f,&ex_pos) ) { |
|||
int c; |
|||
for( c=fgetc(f); c!=EOF; c=fgetc(f) ) { |
|||
if( '\n'==c ) { |
|||
if( '\n'!=(c=fgetc(f)) ) { |
|||
ungetc( c, f ); |
|||
} |
|||
else { |
|||
++l; |
|||
break; |
|||
} |
|||
} |
|||
++l; |
|||
} |
|||
l += EOF==c; |
|||
fsetpos( f, &ex_pos ); |
|||
} |
|||
} |
|||
return l; |
|||
} |
|||
/*=========================================================================== |
|||
Loads a paragraph from the file f. Paragraphs are detected looking for the |
|||
occurrences of "\n\n" separators. The loaded paragraph is put into a chunk of |
|||
memory allocated with malloc(). The pointer to that memory is returned. |
|||
If the function fails, no memory is allocated and NULL is returned. |
|||
===========================================================================*/ |
|||
char *load_paragraph( FILE *f ) { |
|||
char *par = NULL; |
|||
if( !feof(f) ) { |
|||
size_t i, l = get_paragraph_length( f ); |
|||
if( ((size_t)-1)!=l ) { |
|||
par = malloc( l+1 ); |
|||
if( par ) { |
|||
for( i=0; i<l; ++i ) |
|||
par[i] = fgetc( f ); |
|||
par[i] = '\0'; |
|||
/* just jump beyond the paragraph delimiter */ |
|||
fgetc( f ); fgetc( f ); |
|||
} |
|||
} |
|||
} |
|||
return par; |
|||
} |
|||
</syntaxhighlight> |
|||
{{ out }} |
|||
<pre> |
|||
Output as required by task. |
|||
</pre> |
|||
=={{header|C++}}== |
=={{header|C++}}== |