나는 이와 같은 약간의 파일을 읽으려고합니다 ...
52 12 123 1
4 2 11
9 88 1 23 42
그리고 파일은 각 줄이 변경되면서 계속됩니다. fscanf와 함께 루프를 사용하여 각 숫자를 개별적으로 읽는 방법을 알고 있지만 첫 번째 숫자를 트리의 부모로 읽고 나머지 줄은 자식으로 읽고 싶습니다. 그래서 이것은 52, 4, 9가 부모가되는 3 개의 나무를 만들 것입니다. 나머지 줄을 읽고 각 정수를 적절한 트리에 추가하려면 어떻게해야합니까? 나는 이것을 c로 코딩하고 있습니다.
한 줄씩 읽은 다음 줄 입력을 정수로 구문 분석하면 좀 더 유연하게 사용할 수 있습니다. 포인터를 사용하여 널 종결자를 찾을 때까지 행을 단계별로 이동하면 행당 다른 정수 수를 수용 할 수 있습니다. 다음은 제공된 샘플 입력에 대해 좋은 작업을 수행하는 솔루션에 대한 빠른 해킹입니다. 코드는 다음과 같습니다.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int
main (int argc, char *argv[]) {
if (argc < 2 ) {
fprintf (stderr, "Error: insufficient input, usage: %s char *fname\n", argv[0]);
return 1;
}
FILE *file;
char *lineptr = NULL;
char *sptr = NULL, *eptr = NULL;
size_t n = 0;
ssize_t len = 0;
int cnt = 0;
int parent = 1;
if ((file = fopen (argv[1], "r")) == NULL) {
fprintf (stderr, "Error: file open failed for '%s'\n", argv[1]);
return 1;
}
while ((len = getline (&lineptr, &n, file)) != -1 ) {
/* strip newline */
if (*(lineptr+len-1) == '\n') {
*(lineptr+len-1) = '\0';
len -= 1;
}
/* test output of line to parse */
printf ("\nLine [%2d]: \"%s\"\n\n", cnt, lineptr);
/* parse line into integers */
parent = 1;
sptr = NULL;
eptr = lineptr;
while (*eptr != '\0') {
if (*eptr != ' ' && sptr == NULL) {
sptr = eptr;
eptr++;
}
while (*eptr != ' ' && *eptr != '\0') {
eptr++;
}
if (*eptr == '\0') {
printf (" add to tree: %d\n", atoi (sptr));
break;
}
if (*eptr == ' ' && sptr != NULL) {
*eptr = '\0';
if (parent) {
printf (" add to tree: %d (parent)\n", atoi (sptr));
parent = 0;
} else {
printf (" add to tree: %d\n", atoi (sptr));
}
*eptr = ' ';
sptr = NULL;
}
eptr++;
}
cnt++;
}
printf ("\nTotal lines parsed: %d\n\n", cnt);
return 0;
}
샘플 데이터의 출력은 다음과 같습니다.
Line [ 0]: " 52 12 123 1"
add to tree: 52 (parent)
add to tree: 12
add to tree: 123
add to tree: 1
Line [ 1]: " 4 2 11"
add to tree: 4 (parent)
add to tree: 2
add to tree: 11
Line [ 2]: " 9 88 1 23 42"
add to tree: 9 (parent)
add to tree: 88
add to tree: 1
add to tree: 23
add to tree: 42
Total lines parsed: 3
더 빠른 방법이 있다고 확신하지만 단순히 포인터가있는 줄을 단계별로 실행하면 문자열 함수 호출에 필요한 상당한 오버 헤드가 제거됩니다. 어떤 유형의 트리를 고려하고 있는지는 모르겠지만이 코드는 현재 printfs가있는 곳에 삽입 루틴을 추가하는 쉬운 방법을 제공합니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다