Search in paragraph's text: Difference between revisions

m
→‎{{header|Wren}}: Changed to Wren S/H
(Created Nim solution.)
m (→‎{{header|Wren}}: Changed to Wren S/H)
 
(3 intermediate revisions by 2 users not shown)
Line 184:
 
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++}}==
<syntaxhighlight lang="c++">
#include <algorithm>
#include <cstdint>
#include <fstream>
#include <iostream>
#include <sstream>
#include <string>
#include <vector>
 
const std::string PARAGRAPH_SEPARATOR = "\n\n";
 
int main() {
std::ifstream file;
file.open("../Traceback.txt");
std::stringstream stream;
stream << file.rdbuf();
std::string file_contents = stream.str();
 
std::vector<std::string> paragraphs;
uint64_t start;
uint64_t end = 0;
while ( ( start = file_contents.find_first_not_of(PARAGRAPH_SEPARATOR, end) ) != std::string::npos ) {
end = file_contents.find(PARAGRAPH_SEPARATOR, start);
paragraphs.emplace_back(file_contents.substr(start, end - start));
}
 
for ( const std::string& paragraph : paragraphs ) {
if ( paragraph.find("SystemError") != std::string::npos ) {
int32_t index = paragraph.find("Traceback (most recent call last):");
if ( index >= 0 ) {
std::cout << paragraph.substr(index) << std::endl;
std::cout << "----------------" << std::endl;
}
}
}
}
</syntaxhighlight>
{{ out }}
<pre>
Output as required by task.
</pre>
 
=={{header|J}}==
Line 232 ⟶ 395:
}
----------------
</pre>
 
=={{header|Java}}==
<syntaxhighlight lang="java">
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
 
public final class SearchInParagraphsText {
 
public static void main(String[] args) throws IOException {
Path filePath = Path.of("./Traceback.txt");
String fileContents = Files.readString(filePath, StandardCharsets.UTF_8);
String[] paragraphs = fileContents.split(PARAGRAPH_SEPARATOR);
for ( String paragraph : paragraphs ) {
if ( paragraph.contains("SystemError") ) {
int index = paragraph.indexOf("Traceback (most recent call last):");
if ( index >= 0 ) {
System.out.println(paragraph.substring(index));
System.out.println("----------------");
}
}
}
}
private static final String PARAGRAPH_SEPARATOR = "\r\n\r\n";
 
}
</syntaxhighlight>
{{ out }}
<pre>
Output as requested by task
</pre>
 
Line 448 ⟶ 644:
=={{header|Wren}}==
{{libheader|Wren-pattern}}
<syntaxhighlight lang="ecmascriptwren">import "io" for File
import "./pattern" for Pattern
 
9,485

edits