리눅스 프로그래밍 질문!
      글쓴이: momos / 작성시간: 목, 2018/10/04 - 6:00오후    
  
  만약에 txt 파일에
1-1, aa aa aa
1-2, bb bb bb
.
.
.
1-11, a a a
.
.
.
11-11, rr rr
이런식으로 저장되어있다면 
,이후에 나오는 단어의 수를 lseek()을 이용해서 구하려면 어떻게 해야할까요?
버퍼에 저장하고 한 글자씩 읽으면서 버퍼가 ' ' 이거나 '\n'일때 카운트하고
'\n'일때 lseek(fd, 5, SEEK_CUR)로 건너뛴 다음 다시 한 글자씩 카운트했는데
그렇다면 1-11,일때나 11-11, 일때처럼 언제 5,6,7번씩 건너 뛰어줘야하는지 헷갈립니다.
, 이후에 단어의 수만 구하면 됩니다! 
그리고 11-21, 이렇게 있을때 11하고 21만 따로 배열에 저장하려면 어떻게 해야할까요?
아이디어를 얻고 싶습니다.
Forums: 


참고해보세요.
- 데이터의 위치와 크기를 정해두면. 빠릅니다.
- 단어 갯수를 별도로 지정해두면. 빠릅니다.
구름 IDE
https://ide-run.goorm.io/
1. lseek
https://www.joinc.co.kr/w/man/2/lseek
open 파일 열기
http://forum.falinux.com/zbxe/index.php?document_srl=408448&mid=C_LIB
read() 파일 읽기
http://forum.falinux.com/zbxe/index.php?document_srl=466628&mid=C_LIB
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <fcntl.h> #include <sys/stat.h> #include <sys/types.h> #include <string.h> int main() { system("clear"); char buf[100]; printf("-------------------\n"); printf("-------------------\n"); /* // FILE * fp; fp = fopen("test.txt", "rt"); if( fp == 0) { return 0; } fseek(fp, 5, SEEK_CUR); char * p = fgets(buf, 100, fp); printf("%s\n", buf); fclose(fp); */ int fd; fd = open("test.txt", O_RDONLY); if (fd < 0) { perror("error : "); exit(0); } int cnt = 0; char t = 0x0a; while(1) { char c; // ssize_t r = read(fd, (void *)&buf[cnt], 1); ssize_t r = read(fd, &c, 1); if(r == 0) { break; } if(r == -1) { perror("error : "); exit(0); } // printf("%c ", c); buf[cnt] = c; cnt++; //enter 0a //' ' 20 //\n 0a //\r 0d // printf("%02d %02x %02x %02x %02x\n", cnt, buf[cnt], ' ' , '\n', '\r'); // if(c == (char)'\n') //비교 됨 // if((char)buf[cnt] == (char)'\n') //비교가 안됨. ㅇ_ㅇ;; // if(memcmp((const void*)&buf[cnt], &t, 1) == 0) //비교 안됨 if(c == t) //비교 됨 { int s; int e; int char_cnt = 0; int char_pos[100]; memset(char_pos, 0x00, 100); for(int i=0; i<cnt; i++) { if(buf[i] == ',') { char tmp[100]; memset(tmp, 0x00, 100); strncpy(tmp, &buf[0], i); printf("숫자 : %s\n", tmp); e = i; s = i; } else if(buf[i] == ' ') { char_pos[char_cnt] = i; // printf("위치 : %d ", char_pos[char_cnt]); // printf("%s %s %s ", &buf[4], &buf[7], &buf[10]); e = i; char_cnt++; } else { } } char_pos[char_cnt] = cnt; for(int i=0; i<char_cnt; i++) { char tmp[100]; memset(tmp, 0x00, 100); s = char_pos[i]; e = char_pos[i+1]; strncpy(tmp, &buf[s], e-s); printf("문자 : %s\n", tmp); } cnt = 0; memset(&buf[0], 0x00, 100); } // printf("%02x ", buf[0]); // printf("%c\n", buf[0]); // printf("%s", buf); } close(fd); return 0; } // ------------------- 숫자 : 1-1 문자 : aa 문자 : aa 문자 : aa 숫자 : 1-2 문자 : bb 문자 : bb 문자 : bb 숫자 : 1-11 문자 : a 문자 : a 문자 : a 숫자 : 11-11 문자 : rr 문자 : rr----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.
매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.
각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com
답변 감사합니다
혹시 헤더파일일
#include
#include
이것밖에 못쓴다면 어떻게할까요?
unistd.h fcntl.h
unistd.h
fcntl.h
참고해보세요.
컴파일은 되네요.
ㅇ_ㅇ;; 초기화와 복사를 배열로 사용하시면 됩니다.
#include <unistd.h> #include <fcntl.h> int main() { // system("clear"); char buf[100]; int fd; fd = open("test.txt", O_RDONLY); if (fd < 0) { return 0; } int cnt = 0; char t = 0x0a; while(1) { char c; // ssize_t r = read(fd, (void *)&buf[cnt], 1); ssize_t r = read(fd, &c, 1); if(r == 0) { break; } if(r == -1) { return 0; } // printf("%c ", c); buf[cnt] = c; cnt++; //enter 0a //' ' 20 //\n 0a //\r 0d // printf("%02d %02x %02x %02x %02x\n", cnt, buf[cnt], ' ' , '\n', '\r'); // if(c == (char)'\n') //비교 됨 // if((char)buf[cnt] == (char)'\n') //비교가 안됨. ㅇ_ㅇ;; // if(memcmp((const void*)&buf[cnt], &t, 1) == 0) //비교 안됨 if(c == t) //비교 됨 { int s; int e; int char_cnt = 0; int char_pos[100]; // memset(char_pos, 0x00, 100); for(int i=0; i<cnt; i++) { if(buf[i] == ',') { char tmp[100]; // memset(tmp, 0x00, 100); // strncpy(tmp, &buf[0], i); // printf("숫자 : %s\n", tmp); e = i; s = i; } else if(buf[i] == ' ') { char_pos[char_cnt] = i; // printf("위치 : %d ", char_pos[char_cnt]); // printf("%s %s %s ", &buf[4], &buf[7], &buf[10]); e = i; char_cnt++; } else { } } char_pos[char_cnt] = cnt; for(int i=0; i<char_cnt; i++) { char tmp[100]; // memset(tmp, 0x00, 100); s = char_pos[i]; e = char_pos[i+1]; // strncpy(tmp, &buf[s], e-s); // printf("문자 : %s\n", tmp); } cnt = 0; // memset(&buf[0], 0x00, 100); } // printf("%02x ", buf[0]); // printf("%c\n", buf[0]); // printf("%s", buf); } close(fd); return 0; }----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.
매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.
각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com
fscanf()로 한줄씩 읽어낸 다음 (정규식을 써서
fscanf()로 한줄씩 읽어낸 다음 (정규식을 써서 가능)
strtok() 함수로 '-', ',' 토큰으로 끊어서 읽으면 가능할 것 같네요.
댓글 달기