My関数は、テキストファイル のセグメントを解析し、開始文字と終了文字列(main()を参照) を使用してセグメントを別々のファイルに保存します。C I/Oと文字列解析が正しく動作しません
私はそれと間違っているかわからないが、それはこれらの3つのセグメントファイルを返します。この入力test.txtのため
1 START_TEXT_END
2 _START_BLABLUB_END
3 START 4 END
を(4 START ... ENDセグメント):
_START_TEXT_END_START_BLABLUB_END_
_START_THIRD_END START 4 END
"START" と "END" が含まれることになっているが、セグメント3( "START_THIRD_END")は および2セグメントが欠落している誤って "_" を含みます。他の入力ファイルでは、結果が不正確になります。
#include "stdio.h"
#include "string.h"
#include "stdlib.h"
long split(char *filename, char *segment_filename, char *str_start, char *str_end, long n_start, long n_end) {
long segments = 0, size_segment = 0;
FILE *file = fopen(filename, "rb"), *segmentfile;
long size_str_start = strlen(str_start);
long size_str_end = strlen(str_end);
long pos_str_start = 0;
long pos_str_end = 0;
int chr;
char *segment_filename_numbered;
char *segment = (char*)malloc(1);
fseek(file,0,0);
if (file) {
while ((chr = fgetc(file)) != EOF && !feof(file) && !ferror(file)) {
size_segment++;
// scan for start string
if (chr == str_start[pos_str_start]) { pos_str_start++; }
else pos_str_start = 0;
if (pos_str_start == size_str_start)
size_segment = size_str_start, pos_str_start = 0;
// scan for end string
if (chr == str_end[pos_str_end]) pos_str_end++;
else pos_str_end = 0;
if (pos_str_end == size_str_end)
{
pos_str_end = 0;
segments++;
if (segments > n_start) {
segment = (char*) realloc(segment, size_segment);
//segment_filename_numbered = chars_cat2(segment_filename, chars_number(segments, '0', 8, 16)); // SOME OF MY LIBRARY FUNCTIONS
segment_filename_numbered = ltoa(segments, segment_filename_numbered, 10);
fseek(file, -size_segment, SEEK_CUR);
fread(segment, size_segment, 1, file);
segmentfile = fopen(segment_filename_numbered, "wb");
fwrite(segment, size_segment, 1, segmentfile);
fseek(file, size_segment, SEEK_CUR);
fclose(segmentfile);
}
}
}
fclose(file);
}
return segments;
}
int main(int argc, char* argv[])
{
split("test.txt", "test_", "START", "END", 0, 0);
system("Pause");
return 0;
}
私はここに新たなんだ、手動で各ラインの前に4つのスペースを追加すると、合計悪夢で、コードをマーキングする簡単な方法は何ですか?
すべてのコードを強調表示し、** '{}' **ボタンをクリックします。 –
これは非常にたくさんありますが、インデントが保存された状態でコードを再ペーストしてから、 '{}'を実行することを認識していますか?読むのが少し難しいです。ごめんなさい。 – gbulmer
ファイルの大きさはどれくらいですか? mmap()を使用してみてください。(Window $のMapViewOfFile) –