리눅스 프로그래밍 질문!

momos의 이미지

만약에 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만 따로 배열에 저장하려면 어떻게 해야할까요?

아이디어를 얻고 싶습니다.

shint의 이미지

- 데이터의 위치와 크기를 정해두면. 빠릅니다.
- 단어 갯수를 별도로 지정해두면. 빠릅니다.

구름 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

shint의 이미지

컴파일은 되네요.
ㅇ_ㅇ;; 초기화와 복사를 배열로 사용하시면 됩니다.

#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()로 한줄씩 읽어낸 다음 (정규식을 써서 가능)
strtok() 함수로 '-', ',' 토큰으로 끊어서 읽으면 가능할 것 같네요.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.