내 함수는 열기 및 닫기 문자열 (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_
,451,515,_START_THIRD_END START 4 END
"START"및 "END"가 포함되는 것으로 생각되지만, 세그먼트 3 ("START_THIRD_END")는 누락되고 2. 세그먼트 잘못에 "_"포함한다. 다른 입력 파일을 사용하면 결과가 부정확 해집니다. 아이디어가 있으십니까? 각 줄의 앞 4 자리를 추가 내가 여기 새로 왔어
#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;
}
은 수동으로 코드를 표시의 쉬운 방법은 무엇 총 악몽인가?
모든 코드를 강조 표시하고 **'{}'** 버튼을 클릭하십시오. –
나는 이것이 많이 요구된다는 것을 알고 있지만 들여 쓰기가 보존 된 상태에서 코드를 다시 작성한 다음'{} '을 수행하겠습니까? 읽을 시간이 조금 있습니다. 죄송합니다. – gbulmer
파일의 크기는 얼마입니까? mmap() (Window $에서 MapViewOfFile)을 사용 해보십시오. –