336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

개념 : 


1. fseek 함수를 대체 하여 fsetpos를 사용할 수 있다.


2. ftell 함수를 대체 하여 fgetpos를 사용할 수 있다.


3. fpos_t 형 자료를 쓰며 정수를 기록할수 있고 기준 점은 첫 시작 포인터 이다


4. write 모드 에서 사용해야 한다.


5. 원형 


int fgetpos(FILE *stream, fpos_t *pos)


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




소스코드: main.c


#include <stdio.h>




void main(void)


{


int returnValue = 0;


FILE *write = 0, *read = 0;

fpos_t pos = 0 , move = 0;


char szBuffer[256] = { 0, };




fopen_s(&write, "E:\\300\\113\\file.txt", "w+");




if (write == NULL)


{


puts("fail : create file");


}


else


{

fgetpos(write, &pos);


printf_s("기록 전 파일 포인터의 위치 : %d\n", pos );


fputs("write text", write);


puts("write text");


fgetpos(write, &pos);


printf_s("기록 후 파일 포인터의 위치 : %d\n", pos);




puts("fset pos 를 이용해 파일 위치를 처음 이동");


move = 0;

fsetpos(write, &move);


//returnValue = fseek(write, 6, SEEK_SET);

move = 6;

fsetpos(write, &move);


fgetpos(write, &pos);

printf_s(" fsetpos : move (6), 호출 후 파일 포인터의 위치 : %d\n", pos);


fputs("call fsetpos : 6 ", write);


fgetpos(write, &pos);


printf_s("마지막 포인터 위치 : %d \n", pos);


fclose(write);



// 파일 읽기 모두로 생성하여  확인


fopen_s(&read, "E:\\300\\113\\file.txt", "r");


if (read == NULL)


{


puts("faild read file");


}


else


{


fgets(szBuffer, sizeof(szBuffer), read);


puts(szBuffer);


fclose(read);


}


}

}




결과





#파일포인터구하기,#fsetpos,#fgetpos,#프로그램입문,#c언어,#c언어입문

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

개념 : 


1. 파일 포인터를 내마음 대로 옮길수 있다.


2. 파일 끝부분 이상으로 기록할 경우. 파일 끝 다음으로 기록되어 의도하지 않게 값이 저장 안 될 수 있다.


3. 원형 과 파라메터 

     int fseek( FILE *stream, long offset, int origin)

stream :  파일

offset : 파일 포인터의 이동값(1 칸이 1byte)

origin : 어디서 부터 포일 포인터를 움직일지에 대한 플래그 값


origin 에 들어 갈수 있는 값

SEEK_SET (값 : 0) : 파일 포인터를 처음으로 부터

SEEK_CUR (값 : 1) : 현재 파일 포인터가 있는 곳 부터

SEEK_END (값 : 2) : 파일 끝부분 부터



offset 값은 - 와 + 부호를 가지고 전진과 후진을 할 수 있다.


example :

fseek(write, -3, SEEK_END)

-파일 끝부분 부터 처음 방향으로 3칸 간다.



fseek(write, 0, SEEK_SET)

-파일 포인터를 처음으로부터 끝방향으로 0칸 간다.



fseek(write, 8, SEEK_CUR)

-현재 파일 포인터가 있는 곳 부터 끝방향으로 8칸 간다.





소스 코드 : main.c

#include <stdio.h>


void main(void)

{

int returnValue = 0;

FILE *write = 0, *read = 0;

char szBuffer[256] = { 0, };


fopen_s(&write, "E:\\300\\112\\file.txt", "w+");


if (write == NULL)

{

puts("fail : create file");

}

else

{

printf_s("기록 전 파일 포인터의 위치 : %d\n", ftell(write));

fputs("write text", write);

puts("write text");

printf_s("기록 후 파일 포인터의 위치 : %d\n", ftell(write));


puts(" 파일 위치를 처음 이동");

returnValue =fseek(write, 6, SEEK_SET);


printf_s(" call fseek : 6, SEEK_SET 호출 후 파일 포인터의 위치 : %d\n", ftell(write));

fputs("call fseek : 6, SEEK_SET  ", write);

fclose(write);



// 파일 읽기 모두로 생성하여  확인

fopen_s(&read, "E:\\300\\112\\file.txt", "r");

if (read == NULL)

{

puts("faild read file");

}

else

{

fgets(szBuffer, sizeof(szBuffer), read);


puts(szBuffer);



fclose(read);


}

}

}




결과



#c언어입분, #C언어, #fseek, #SEEK_SET, #SEEK_CUR, #SEEK_END, #파일포인터이동



336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

개념 : 


1. 파일 버퍼를 일정 크기 만큼 채우지 않고 비운다.


2. 표준 입- 출력 (stdin, stdout) 버퍼를 비운다.


사용 이유 : 


데이터는 파일에 저장되기 전 임시 버퍼에 기록이 됩니다. 갑작스럽게 전원이 차단되면 임시 버퍼의 내용이 기록 되지 않습니다.  하지만 fflush를 호출


하여 버퍼를 즉시 비우고 바로 내용을 기록할 수 있습니다. 예를 들어 메모장에 텍스트를 입력하고 저장하지 않고 강제 종료를 하게 된다면 기록되지 


않는 것과도 같습니다.



소스 코드 :  main.c

#include <stdio.h>


void main(void)

{

FILE *write = 0, *read =  0;

char szBuffer[256] = { 0, };


fopen_s(&write, "E:\\300\\109\\file.txt", "w+" );


if (write == NULL)

{

puts("fail : create file");

}

else

{

fputs("write text \n", write);

puts("success : write file");


puts("call fflush");

fflush(write);// 즉시 "write text" 기록한다.

fclose(write);

fopen_s(&read, "E:\\300\\109\\file.txt", "r");

if (read == 0)

{

puts("fail : read file");

}

else

{

puts("success : read file");

fgets(szBuffer, 256, read);

puts(szBuffer);



fgets(szBuffer, 256, read);

printf("%s", szBuffer);


fclose(read); 

}



}

}



결과  



#c언어입문,#c언어,#파일버퍼비우기,#fflush,#임시저장구현



336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

목표 : 

문자한개씩 기록하고 이기록한 코드를 출력하는 프로그램을 만들어보고 실재 있는지도 확인한다.



소스코드 : main.c

#include <stdio.h>


void main(void)

{

FILE *pText = NULL;

int count = 0;

int temp = 0;


fopen_s(&pText, "c:\\example\\Text.txt", "w+"); // 모드 w+를 없으면 만들어서 써라입니다. w 는 그냥 쓰기모드입니다



if (pText == NULL)

{

puts("text 파일 생성 실패");

}

else

{

puts("text 파일 생성 성공");


//문자 하나씩 기록

fputc('L', pText);

fputc('e', pText);

fputc('e', pText);

fputc('J', pText);

fputc('u', pText);

fputc('n', pText);

fputc('M', pText);

fputc('o', pText);

fputc('\n', pText);//개행문자


  //다썻으니 한번 닫어줍니다.

fclose(pText);


// 다시 읽어들여서 반복문을 통해서 콘솔창에 출력을 해봅니다.

fopen_s(&pText, "c:\\example\\Text.txt", "r"); // 모드를 r로 해줍니다. read의 약자이겠지요


while (count < 9)

{

temp = fgetc(pText);

putchar(temp);

count++;

}


fclose(pText);//당연히 열었으니 닫아줍니다.

}


}




결과





 #c언어, #c언어입문, #프로그램입문, #한문자씩읽고쓰기,#fgetc,#fputc

 



336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

개념 : 


1. 보조기억장치에 파일을 생성합니다.


2. 경로가 잘못되거나 없으면 생성에 실패 합니다.




목표 : 


text 파일과 xml 파일을 만들어 봅니다.




준비 : 


c:\\example 폴더를 만들어 줍니다.




소스코드 : main.c

#include <stdio.h>


void main(void)

{

FILE *pText = NULL;

FILE *pXML = NULL;


fopen_s(&pText, "c:\\example\\Text.txt", "w+");

fopen_s(&pXML, "c:\\example\\XML.xml", "w+");


if (pText == NULL)

{

puts("text 파일 생성 실패");

}

else

{

puts("text 파일 생성 성공");

}


if (pXML == NULL)

{

puts("XML 파일 생성 실패");

}

else

{

puts("XML 파일 생성 성공");

}

}




결과 : 



미리 만들어 놓은 폴더로 가서 확인한다.




파일이 생성 된 것을 확인할수 있습니다.




 #c언어, #c언어입문, #프로그램입문, #fopen_s, #파일생성

 

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

개념 : 

1. 함수를 가르키는 특수한 함수

2. 함수이름자체도 주소값을 가지고있다.

3. 반환형태와 매계변수를 같게 하고  (*이름) 형식으로 만들수 있다.


목표 : 

기존 소스를 활용하여 Process 함수를 FunctionPointer 함수로 가르키고 하고 사용해본다.


소스코드 : main.c

#include <stdio.h>

#define MAX 256

#define type_String (unsigned char)0

#define type_Integer (unsigned char)1


struct tagStruct1

{

unsigned char type;

unsigned char szBuffer[MAX];

};


struct tagStruct2

{

char type;

int nNumber;

};


void Process(void *); // 포로토 타입 선언


void main(void)

{

//< 함수 포인터 추가

void(*FunctionPointer)(void*);


FunctionPointer = Process;//함수포인터 값 대입


 //< 데이터를 선언

struct tagStruct1 Data1;

struct tagStruct2 Data2;


//Data1 정의

Data1.type = type_String;

sprintf_s(Data1.szBuffer, sizeof(Data1.szBuffer), " Type1의 데이터 입니다. 어떠한 문자열을이든 저장할수 있겠군요.");


//Data2 정의

Data2.type = type_Integer;

Data2.nNumber = 38;


void *pInput = (void*)&Data1;


FunctionPointer(pInput);


pInput = (void*)&Data2;


FunctionPointer(pInput);


return;

}


void Process(void* pData)

{

unsigned char type = *(char*)pData;


switch (type)

{

case type_String:

puts(" tagSturct1 식별 ");

puts(((struct tagStruct1*)pData)->szBuffer);

puts("");

break;


case type_Integer:

puts(" tagSturct2 식별 ");

printf("정수 출력 : %d \n\n", ((struct tagStruct2*)pData)->nNumber);

break;


default:

break;

}

}



결과 :



#c언어, #c언어입문, #프로그램입문, #함수포인터


336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

개념 : 


1. 무엇이든 가르킬수 있는 포인터


2. void 형으로는 사용할수 없으므로 항상 형변환을 화여 사용하여 줍니다.




목표 : 


매개 변수로 void 형과 타입을 받아 앞에 1바이트를 읽어 들이고 식별하여 상황에 맞게 움직이는 포인터를 만들어 보자




소스코드 : 

#include <stdio.h>

#define MAX 256

#define type_String (unsigned char)0

#define type_Integer (unsigned char)1


struct tagStruct1

{

unsigned char type;

unsigned char szBuffer[MAX];

};


struct tagStruct2

{

char type;

int nNumber;

};


void Process(void *); // 포로토 타입 선언


void main(void)

{

//< 데이터를 선언

struct tagStruct1 Data1;

struct tagStruct2 Data2;


//Data1 정의

Data1.type = type_String;

sprintf_s(Data1.szBuffer, sizeof(Data1.szBuffer), " Type1의 데이터 입니다. 어떠한 문자열을이든 저장할수 있겠군요.");


//Data2 정의

Data2.type = type_Integer;

Data2.nNumber = 38;


void *pInput = (void*)&Data1;


Process(pInput);


pInput = (void*)&Data2;


Process(pInput);


return;

}


void Process(void* pData)

{

unsigned char type = *(char*)pData;


switch (type)

{

case type_String:

puts(" tagSturct1 식별 ");

puts(((struct tagStruct1*)pData)->szBuffer);

puts("");

break;


case type_Integer:

puts(" tagSturct2 식별 ");

printf("정수 출력 : %d \n\n", ((struct tagStruct2*)pData)->nNumber);

break;


default:

break;

}

}



결과 



#c언어, #c언어입문, #프로그램입문, #void포인터


'Programing - C > C Basic grammar ' 카테고리의 다른 글

105 fopen(파일생성)  (0) 2017.08.10
104 함수 포인터  (0) 2017.08.07
102 구조체를동적할당해서포인터로사용해보기  (0) 2017.08.07
101 구조체(struct)  (0) 2017.08.07
100 다차원 배열  (0) 2017.08.04
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

개념 :


동적할당이나 포인터로 참조할때는 접근 법이 닷에서 지시연산자로 바뀝니다.



목표 : 


예제101 소스를 정적할당에서 동적할당으로 변경하여 사용하기




소스코드 : main.c

#include <stdio.h>

#include <malloc.h>

struct  tagStudentScor

{

int kor;

int eng;

int math;


char szName[256];

};


int main(void)

{

struct tagStudentScor* pPage = NULL;

//메모리를 블럭으로 생성하고 초기화하는 함수호출 

pPage = calloc(sizeof(struct tagStudentScor), sizeof(struct tagStudentScor));


sprintf_s(pPage->szName, sizeof(pPage->szName), "LeeJunmo\0");

pPage->kor = 100;

pPage->eng = 100;

pPage->math = 100;


printf("성적카드 출력\n");

printf("이름 : %s \n", pPage->szName);

printf("국어 : %d \n", pPage->kor);

printf("영어 : %d \n", pPage->eng);

printf("수학 : %d \n", pPage->math);


free(pPage);


return 0;

}


결과



#구조체를동적할당해서포인터로사용해보기,#c언어, #c언어입문, #프로그램입문



'Programing - C > C Basic grammar ' 카테고리의 다른 글

104 함수 포인터  (0) 2017.08.07
103 void Pointer  (0) 2017.08.07
101 구조체(struct)  (0) 2017.08.07
100 다차원 배열  (0) 2017.08.04
099 포인터 배열  (0) 2017.08.04
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

개념 :


1. 사용자 정의 자료형


2. 기본 자료형을 활용하여 사용자가 원하는 자료형을 만들수 있습니다.





목표 : 


성적표 구조체를 만들어 본다.






소스코드 : main.c

#include <stdio.h>

//구조체 정의

struct  tagStudentScor

{

int kor;

int eng;

int math;


char szName[256];

};


int main(void)

{

//선언

struct tagStudentScor stPage;

//접근 및 사용

sprintf_s(stPage.szName, sizeof(stPage.szName), "LeeJunmo\0");

stPage.kor = 100;

stPage.eng = 100;

stPage.math = 100;


printf("성적카드 출력\n");

printf("이름 : %s \n", stPage.szName);

printf("국어 : %d \n", stPage.kor);

printf("영어 : %d \n", stPage.eng);

printf("수학 : %d \n", stPage.math);


return 0;

}





결과



#c언어, #c언어입문, #프로그램입문, #구조체, #struct


'Programing - C > C Basic grammar ' 카테고리의 다른 글

103 void Pointer  (0) 2017.08.07
102 구조체를동적할당해서포인터로사용해보기  (0) 2017.08.07
100 다차원 배열  (0) 2017.08.04
099 포인터 배열  (0) 2017.08.04
098 Call by Reference & Call by Value  (0) 2017.08.04
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

개념:


1. 물리적으로는 한줄로 된 배열입니다(정적 할당시)


2. 1차원 배열과는 다르게 상황에 맞게 할당하여 사용하면 생각보다 매우 편리합니다.


3. 선언법은 꺽쇠가로로 만들수있습니다.


ex) 2차원 배열


array[10][10] // 10개의 공간


ex) 3차원 배열


array[10][10][10] //100개의 공간



소스 코드 : main.c

#include <stdio.h>


#define KOR 0

#define ENG 1

#define MATH 2

#define MAJOR_MAX 3


#define JUNMO 0

#define GILDONG 1

#define AMUGEA 2


#define STUDENT_INDEX_MAX 3


int main(void)

{


int major = 0;

int student = 0;


int ScoreBoard[STUDENT_INDEX_MAX][MAJOR_MAX] = { 0, };//전부 0으로 초기화


 // 0 번째 학생의 성적을 정리한다.

ScoreBoard[JUNMO][KOR] = 80;

ScoreBoard[JUNMO][ENG] = 92;

ScoreBoard[JUNMO][MATH] = 88;


// 1 번째 학생의 성적을 정리한다.

ScoreBoard[GILDONG][KOR] = 70;

ScoreBoard[GILDONG][ENG] = 82;

ScoreBoard[GILDONG][MATH] = 68;


// 2 번째 학생의 성적을 정리한다.

ScoreBoard[AMUGEA][KOR] = 100;

ScoreBoard[AMUGEA][ENG] = 70;

ScoreBoard[AMUGEA][MATH] = 30;


for (student = 0; student < STUDENT_INDEX_MAX; student++)

{

for (major = 0; major < MAJOR_MAX; major++)

{

printf("ScoreBoard[%d][%d] = %d\n", student, major, ScoreBoard[student][major]);

}

puts("");// 개행을 위해서 한번 호출

}


return 0;


}



결과


#c언어, #c언어입문, #프로그램입문, #다차원배열


'Programing - C > C Basic grammar ' 카테고리의 다른 글

102 구조체를동적할당해서포인터로사용해보기  (0) 2017.08.07
101 구조체(struct)  (0) 2017.08.07
099 포인터 배열  (0) 2017.08.04
098 Call by Reference & Call by Value  (0) 2017.08.04
097 포인터 개념  (0) 2017.08.04

+ Recent posts