프로그래밍/ExampleCode.com

[fseek] 파일 포인터이동 예제

jinkwon.kim 2018. 8. 27. 23:27
728x90
반응형

fseek Example Code in C

<무단 배포 금지합니다!!!>

1. 함수 설명

  - 파일 Pointer의 값을 이동 시키는 함수 있다.

  - 파일은 Open 한 후 처음 부터 읽는 것이 아니라 nbyte 떨어진 곳부터 읽고 싶은 때 사용한다. 

 헤더

 stdio.h 

 형태

 int fseek( FILE *stream, long offset, int whence);

 인수

 FILE *stream

  파일 포인터

 

 Long offset

  건너 뛸 byte수

 

 int whence

 시작 시점 

 SEEK_SET  :  파일 시작

 SEEK_CUR : 현재 포인터 위치

 SEEK_END : 파일 끝

 반환

 int

 
















2. 연관 함수

  1) long ftell(FILE *stream);

  2) void rewind(FILE *stream);

  3) int fgetpos(FILE *stream, fpos_t *pos);

  4) int fsetpos(FILE *stream, const fpos_t *pos);


3. fseek (SEEK_SET)  예제

  1) Makefile 


CC = gcc

CFLAGS = $(DEFS) -ggdb -O2 -Wall -I./

fseek : fseek.o
	$(CC) $(CFLAGS) -o $@ $^ 

clean :
	rm -rf fseek *.o fseek_struct_test  fseek_test.txt



  2) Header


/* Copyright (C) 
* 2018 - chun4foryou
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
* 
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
* GNU General Public License for more details.
* 
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
* 
*/
typedef struct _data {
  char name[60];
  int  value;
}DATA;

int write_struct(char *file_name);

 

 3) Code Example


/* Copyright (C) * 2018 - chun4foryou * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * */ #include <stdio.h> #include <unistd.h> #include <string.h> #include "fseek.h" #define STRUCT_TEST // 구조체를 저장 하고 읽어 오는 Sameple Code Define #ifndef STRUCT_TEST #define MAX_LEN 30 /** * @brief 문자열 fseek example * 원하는 byte만큼 건더 뛴 후 data를 Read한다. * * @param argc * @param argv * * @return */ int main(int argc, char **argv) { FILE *fp = NULL; char buffer[MAX_LEN+1]; int result = 0; int i = 0, nbyte = 0; char ch = 0; fp = fopen("./fseek_test.txt", "r"); if (fp == NULL) { return 0; } // 건너뛸 바이트 수 설정 nbyte = 1; /* moves the pointer after the N byte */ result = fseek(fp, nbyte, SEEK_SET); if (result == 0) { printf("Pointer successfully moved to the beginning of the file.\n"); } else { printf("Failed moving pointer to the beginning of the file.\n"); } for (i = 0; (i < (sizeof(buffer)) && ((ch = fgetc(fp)) != EOF)); i++) { buffer[i] = ch; fprintf(stderr, "%c", buffer[i]); } fclose(fp); return 0; } #else /** * @brief 구조체 fseek example * 원하는 구조체 갯수 만큼 건더 뛴 후 data를 Read한다. * * @param argc * @param argv * * @return */ int main(int argc, char **argv) { FILE *fp; int i = 0, result = 0, skip_data_cnt = 0; DATA data[10]; // write할 구조체 배열 생성 fprintf(stderr, "%zu\n", sizeof(DATA)); result = write_struct("./fseek_struct_test"); if (result != 0 ) { return 0; } fp = fopen("./fseek_struct_test", "rb"); if (fp == NULL) { return 0; } // 건너뛸 데이터 갯수 skip_data_cnt = 0; /* moves the pointer after the N byte */ result = fseek(fp, skip_data_cnt * sizeof(DATA) , SEEK_SET); if (result == 0) { printf("Pointer successfully moved to the beginning of the file.\n"); } else { printf("Failed moving pointer to the beginning of the file.\n"); } // 문자열 데이터 읽기 for (i = 0 ; i < 10; i++) { if (fread((char *)&data[i], 1, sizeof(DATA), fp) == sizeof(DATA)) { fprintf(stderr, "name [%s]\n", data[i].name); fprintf(stderr, "value[%d]\n", data[i].value); } else { fprintf(stderr, "Size is Invalied\n"); } } fclose(fp); return 0; } /** * @brief Sample Data file 생성 * * @param file_name * * @return */ int write_struct(char *file_name) { FILE *fp = NULL; int i = 0, result = 0; DATA data[10]; // write할 구조체 배열 생성 // 기존 파일 삭제 unlink("./fseek_struct_test"); fp = fopen("./fseek_struct_test", "ab"); if (fp == NULL) { return -1; } // 구조체 데이터 읽기 memset(data, 0, sizeof(data)); for (i = 0; i < 10; i++) { snprintf(data[i].name, sizeof(data[i].name),"Struct %d",i); data[i].value = i; result = fwrite((char *)&data[i], sizeof(DATA), 1, fp); if (result == 0) { break; } } fclose(fp); return 0; } #endif


728x90
반응형

'프로그래밍 > ExampleCode.com' 카테고리의 다른 글

[IPC] shared memory 예제 코드  (5) 2018.09.20
[IPC] pipe 예제 코드  (0) 2018.09.20
[IPC] named pipe 예제 코드  (0) 2018.09.20
[IPC] message queue 예제 코드  (0) 2018.09.20
[IPC] 메모리 맵 mmap() 예제 코드  (0) 2018.09.20