我的函數使用開始和結束字符串(請參閱main()) 解析文本文件 中的段,並將段保存在單獨的文件中。C I/O和字符串解析 - 行爲不規律
我不知道什麼是錯的,但它返回這3段文件:
1 START_TEXT_END
2 _START_BLABLUB_END
3 START 4 END
此輸入的test.txt (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個空格手動是一個總的噩夢,什麼是標記代碼的簡單方法?
突出顯示所有代碼並單擊**'{}'**按鈕。 – 2012-03-23 01:21:47
我意識到這是相當多的要求,但會重新保存你的代碼,並保留縮進,然後執行'{}'?這是有點難以閱讀。抱歉。 – gbulmer 2012-03-23 01:38:02
文件有多大?嘗試使用mmap()(Window $中的MapViewOfFile) – 2012-03-23 11:43:49