Строка
while ( (chr = fgetc(file)) != EOF && !feof(file) ...
Немного странно.Одного или другого теста достаточно, но это не имеет значения.
Надеюсь, вы не возражаете, но я попытался организовать программу в стиле, который я мог бы написать, чтобы увидеть, смогу ли я увидетьошибка.Это помогло мне прочитать его, но я не увидел ни одной новой ошибки, кроме сообщения Уильяма Морриса: - (
Я думаю, что у меня может возникнуть искушение 'fseek 0', чтобы получить позицию файла для начала и конца,хотя это не так эффективно. По крайней мере, это может помочь отладить его? -)
Это может помочь другим следовать за ним.Если я допустил ошибку, это может быть область, которая не очевидна.
#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, *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);
enum {LOOKING_FOR_START, LOOKING_FOR_END, MATCHED_MARKERS }
state = LOOKING_FOR_START;
if ((file=fopen(filename, "rb")) == NULL) {
fprintf(stderr, "Error: can't open file %s\n", filename);
return 0;
}
while ( (chr = fgetc(file)) != EOF && !feof(file) && !ferror(file)) {
size_segment++;
switch (state) {
case LOOKING_FOR_START:
// 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;
state = LOOKING_FOR_END;
}
break;
case LOOKING_FOR_END:
// 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;
state = MATCHED_MARKERS;
}
break;
case MATCHED_MARKERS:
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
//*** Error: uninitialised segment_filename_numbered ***
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);
}
state = LOOKING_FOR_START;
default:
fprintf(stderr, "Fatal Error: state has become corrupt, value is %d\n", state);
break;
}
}
fclose(file);
return segments;
}
int main(int argc, char* argv[])
{
split("test.txt", "test_", "START", "END", 0, 0);
system("Pause");
return 0;
}