신세계 텍스트 출력
member photo 성천사 1 253 0 2024-08-06 14:00:03

// 지정텍스트의 라인 구하기

int text_counter(char filename[MAX_INPUT_LENGTH])
{
    char buffer[MAX_INPUT_LENGTH]="";
    char buf[MAX_INPUT_LENGTH]="";
    int linechk = 0;
    FILE *fp;

 

    if (!(fp = fopen(filename, "r"))) {
        sprintf(buf, "SYSERR:%s 파일없음", filename);
        log(buf);
        return 0;
    }


    while (!feof(fp)) {
        if (fgets(buffer, MAX_INPUT_LENGTH, fp) == NULL)
            break;
        linechk++;
    }

    fclose(fp);


    if (linechk)
        return linechk;


    return 0;
}

 

#define PAGE_MAX 512


// 2024-07-31., 최종 2024-08-05
void load_text(struct char_data *ch, char line1[MAX_INPUT_LENGTH], char line2[MAX_INPUT_LENGTH], char filename[MAX_INPUT_LENGTH], char output[MAX_STRING_LENGTH], int opt)
{

    int text_counter(char lname[MAX_INPUT_LENGTH]);
    char buffer[MAX_INPUT_LENGTH]="";
    char sbuf[MAX_INPUT_LENGTH]="";
    int i = 0, found = 0, linechk = 0;
    FILE *fp;

 

    output[0] = '0';

 

    linechk = text_counter(filename);

 

   if (!(fp = fopen(filename, "r"))) {
        sprintf(sbuf,"에러! %s 파일이 없습니다.rn", filename);

        log(sbuf);
        return;
    }

    if (opt == 0) {

       if (linechk > 0) {
          sprintf(sbuf, "&c02%s&c07 안에는 &c02%d&c07 줄의 내용이 저장되어 있습니다.rnrn", 
                           filename, linechk);
          send_to_char(sbuf, ch);
       } else {
           send_to_char("저장된 내용이 없습니다.rn", ch);

           fclose(fp);

           return;
       }

    }

    if (is_number(line1) && !*line2) {

       sprintf(line2, "%d", linechk);

    }

    if (is_number(line1)) {
        if (atoi(line1) < 1 || atoi(line1) > linechk)
            sprintf(line1, "%d", 1);

        while (!feof(fp)) {
            if (fgets(buffer, MAX_INPUT_LENGTH, fp) == NULL)
                break;
            found++;
            if (found < atoi(line1)) // 지정 라인부터 출력
                continue;
            if (found > atoi(line2))
                continue;
            if ((strlen(output + PAGE_MAX) > MAX_STRING_LENGTH))
                break;

            // 이것을 넣지 않으면 줄 정렬이 되지 않음 그냥 r 이 아니라 CR(캐리지리턴) 백슬래시 입니다.
            strcat(buffer, "r");
            strcat(output, buffer);
        }
        fclose(fp);

    if (opt == 0) {

        if (!found) {
            send_to_char("일치하는 내용을 찾을 수 없습니다.rn", ch);
        }

    }
        return;
    } else { // 문자 입력이면
        while (!feof(fp)) {
            if (fgets(buffer, MAX_INPUT_LENGTH, fp) == NULL)
                break;
            if (!strstr(buffer, line1)) // 지정 라인부터 출력
                continue;
            if ((strlen(output + PAGE_MAX) > MAX_STRING_LENGTH))
                break;

            // 이것을 넣지 않으면 줄 정렬이 되지 않음 그냥 r 이 아니라 CR(캐리지리턴) 백슬래시 입니다.
            strcat(buffer, "r");
            strcat(output, buffer);
            found++;
        }
        fclose(fp);

        if (opt == 0) {

            if (!found) {
            send_to_char("일치하는 내용을 찾을 수 없습니다.rn", ch);
            }

        }
        return;    
    }
}

/*

이 코드는 텍스트 파일명을 입력하고 숫자로 범위를 지정하거나 문자열을 입력하면 일치하는 라인을 모아서 output 으로 출력하는 기능을 합니다.  최종적으로 send_to_char(buf, ch); 를 이용하거나 page_string(ch->desc, buf, 0, 0); 을 이용해서 출력하면 됩니다.

 기본 폴더가 lib 이니 다른 폴더를 찾을 시 경로를 입력해야합니다. "../syslog.txt" 또는 "text/motd" 와 같은 방식으로.

숫자로 범위 지정시 load_text(ch, arg1, arg2, "text/motd.txt", buf); 와 같은 방식으로 설정
문자로 지정시 load_text(ch, arg1, "", "../syslog.txt", buf);  와 같은 방식으로 설정

공백을 포함한 문자열 검색을 하려면 arg1 이 적힌 자리에 two_arguments 함수를 사용해 나눠져 단어 하나가 담긴 arg1 과 같은 것이 아닌 전체 명령어가 담긴 argument+1 혹은 argument 를 입력하면 됩니다.  참고: argument[0] 에는 공백이 담겨져 있을 수 있습니다.

*/

0
정회원 이상만 코멘트 사용이 가능합니다.
총 게시물 32개 / 검색된 게시물: 32개
    쪽지를 전송하고 있습니다. 잠시 기다려주세요.
    쪽지보내기
    받는이(ID/닉네임)
    내용
    쪽지가 도착하였습니다.
    쪽지 내용을 읽어오고 있습니다. 잠시 기다려주세요.
    --