setsockopt(IN SOCKET socket, IN int name, IN int optlevel, IN const char* optvalue, IN int optlen);

[1] 입출력 버퍼크기의 변경

SOCKET sock = socket(PF_INET, SOCK_STREAM, 0);
int send_buf = 500;
i
nt rcv_buf = 1000;
int state = setsockopt(sock, SOL_SOCKET, SO_RCVBUF, (char*)&rcv_buf, sizeof(rcv_buf));
if(state) errorhandling("setsockopt() error");
state = setsockopt(sock, SOL_SOCKET, SO_SNDBUF, (char*)&send_buf, sizeof(send_buf));
if(state) errorhandling("setsockopt() error");
 

[2] Nagle 알고리즘의 적용 - 한번에 모아서 전송
TCP 소켓은 기본적으로 Nagle 알고림을 사용하여 한번에 모아서 전송함. 지연 발생(100~200ms).
이 옵션 사용시 리턴과 동시에 데이터 전송이 이루어지나 회선 부하가 많아짐.

int sock;
int flag = 1; // 네이글 알고리즘 off
sock = open(...);
if ( setsockopt(sock, IPPROTO_TCP, TCP_NODELAY, (char *)&flag, sizeof(int)) < 0)
{
printf("setsockopt error\n");
....
}


[3] 송/수신 TIMEOUT 설정 - 블러킹 소켓일 경우

SCOKET hSocket;
int nErrorCode;
hSocket = socket(AF_INET,SOCK_STREAM,0);
~~~~
nErrorCode = connect(~~~~~~);
~~~
// RECEIVE & SEND TIMEOUT 설정법
// hSocket이 블럭킹상태(Blocking) 일경우 해당된다. 논 블럭킹 상태(None-Blocking) 이면 recv에서 SOCKET_ERROR를 반환하고
//WSAGetLastError()로 확인 하면 WSAEWOULDBLOCK를 반환 한다. 
//WSAEWOULDBLOCK이 에러가 아니고, 다른 에러 이면 에러 코드를 참조 하여 에러 처리를 한다. 
// Receive Time Out Value : 3000 (약 3초)

int nTimeOutValue = 3000;
nErrorCode = setsockopt(hSocket, SOL_SOCKET, SO_RCVTIMEO, (const char*) & nTimeOutValue, sizeof(nTimeOutValue));
if(SOCKET_ERROR == nErrorCode){ // 에러 처리
}
nErrorCode = setsockopt(hSocket, SOL_SOCKET, SO_SNDTIMEO, (const char*) & nTimeOutValue, sizeof(nTimeOutValue));
if(SOCKET_ERROR == nErrorCode) { // 에러 처리
}
nErrorCode = send(hSocket,버퍼,전송할 버퍼크기, 0);
~~~
nErrorCode = recv(hSocket,버퍼, 버퍼크기, 0);
~~~

 

[4] 소켓 종료시 종료방식 설정

LINGER 구조체의 _onoff _linger 두개의 값에 플래그를 지정하고 setsockopt 에 설정
l_onoff = 0, l_linger = 0(또는 1) : 버퍼에 있는 내용을 모두 전송후 연결 종료한다.
l_onoff = 1, l_linger = 0 : 즉시 연결을 종료한다. 상대방에게는 FIN이나 RTS 시그널이 전달된다.
l_linger = 1 : 버퍼에 있는 내용을 모두 전송후에 연결을 종료한다. 이 동안 closesocket 은 block 된다.

LINGER opt = {onoff, linger}; // 값을 설정
setsockopt(socket, SOL_SOCKET, SO_LINGER, (char *)&opt, sizeof(opt));


[5] 소켓 비정상 종료시 재 bind 를 허용하도록 함

bind 되었던 소켓이 서버의 비정상 종료로 커널이 아직 그 정보를 갖고 있을 경우, 다시금 bind 할 수 없는 경우가 있는데, 이때 선점된 주소로 인해 bind에 실패할 수 있다. 이 옵션은 재 bind 할 수 있도록 한다.

bool reuseflag = true;
setsockop(listen_sock, SOL_SOCKET, SO_REUSEADDR, (char *)&reuseflag, sizeof(reuseflag));
 

[6] UDP 소켓을 브로드캐스트 가능하도록 설정

디폴트로 생성되는 UDP소켓은 브로드캐스트가 불가능하도록 설정되어있다. 이 소켓을 브로트캐스트가 가능하도록 한다.
 

// serverside
memset(&serverAddr, 0, sizeof(serverAddr));
serverAddr.sin_family = AF_INET;
serverAddr.sin_addr.s_addr = inet_addr(szServerAddress);
serverAddr.sin_port = htons(nPort); // 포트는 serverside 와 clientside 모두 통일
state = setsockopt(hSock, SOL_SOCKET, SO_BROADCAST, (char *)&serverAddr, sizeof(serverAddr)); 

Posted by cyj4369
,

파일 입 출력

 

#include <stdio.h>

 

FILE* fopen(const char * filename, const char *mode)

 

 filename

개방하고자 하는 파일의 경로명과 파일명을 동시에 지니는 문자열

 ) filename = “c:\\work\\test.dat” (c:\\work 는 경로명 test.dat 은 파일명)

   *특수문자 역슬래시(\)와 구분하기 위해 (\\) 를 두개 써준다.

 mode

파일의 특징 및 용도를 결정짓는다.

             파일 개방 모드=파일접근모드+데이터 입 출력모드

 

파일 접근 모드

모드

의미

r

    - 파일의 읽기 위해서 개방한다. 오로지 읽는 것만 가능하다.

w

-         데이터를 쓰기 위해 개방한다. 쓰는 것만 가능

-         만약에 fopen함수 호출 시 지정해 준 파일이 존재하지 않으면, 새로운 파일을 생성해서 데이터를 쓰게 된다.

-         지정해 준 파일이 존재하면, 그 파일의 데이터를 지워버리고 데이터를 쓰게 된다.

a

-         w 모드와 달리, 지정해 준 파일이 존재하면 데이터를 지우지 않고 파일의 끝에서부터 데이터를 추가한다.

-         너머지 특징은 w와 같다.

r+

-         파일을 읽고 쓰기 위해 개방한다.

-         파일이 존재하지 않는 경우, 새로운 파일을 생성한다.

-         파일이 존재하는 경우, 파일의 데이터를 지우지 않지만 원래 존재하는 파일의 데이터를 덮어쓰게 된다.

w+

-         r+ 모드와 달리, 지정해 준 파일이 존재하면 모든 데이터를 지워버리고 데이터를 기록한다.

-         나머지 특징은 r+와 같다.

a+

-         r+ 모드와 달리, 지정해 준 파일이 존재하면 파일의 끝에서부터 데이터를 추가한다. (나머지 특징은 r+와 같다.)

 

 

데이터 입출력 모드

모드

의미

t

텍스트 모드 (text mode)

b

  2진 모드(binary mode)

 

 CR(Carriage Return)

 CR은 특수문자 \r로 표현되며, 커서의 위치를 그 중 맨 앞으로 이동하라는 의미

 LF(Line Feed)

 LF \n로 표현 되며, 커서의 위치를 그 다음 줄로 이동하라는 의미이다.

 

“ABC \r DEF”  -> 출력

D

E

F

 

 

 

 

 

 

 

 

 

 

 

 

 

“ABC \n DEF”  -> 출력

A

B

C

 

 

 

 

 

 

 

 

D

E

F

 

 

“ABC \r\n DEF”  -> 출력

A

B

C

 

 

 

 

 

D

E

F

 

 

 

 

 

 

 2진 모드와 텍스트 모드

-         2진 모드: 프로그램상에서 파일로 데이터를 쓰거나 읽어 들이는 경우에 아무런 데이터의 변환도 일으키지 않는 데이터 입출력 모드를 의미한다.

-         텍스트 모드 : 프로그램상에서 파일로 데이터를 쓰거나 읽어 들이는 경우에 데이터 변환이 일어나는 입출력 모드를 의미한다.

(printf와 같은 표준 출력 함수들은 텍스트 모드로 출력하기 때문에 C에서 \n을 입력할 경우\r\n으로 변환되어 출력된다.)

 

FILE 구조체의 포인터 (파일 포인터)

-         fopen 함수의 리턴 값은 FILE이라는 구조체 변수의 포인터이다. FILE 구조체 변수는 개방한 파일에 대한 여러 가지 정보를 지니는 변수이다. 개방한 파일이 무엇인지, 파일 내에 존재하는 데이터를 어디까지 읽어 들였는지, 파일의 끝에 도달했는지에 대한 정보들을 FILE구조체 변수는 지닌다.

 

 

◊ 파일 입출력 함수

-         puts함수는 스트림이 stdout으로 미리 정해져 있지만 fputs함수는 스트림을 지정할 수 있다. 파일 포인터는 스트림을 의미한다.

 

         스트림

기능

키보드/모니터

선택(키보드/모니터,파일)

문자 출력

int putchar(int c)

int fputc(int c, FILE* stream)

문자 입력

int getchar(void)

int fgetc(FILE* stream)

문자열 출력

int puts(const char* s)

int puts(const char* s, FILE* stream)

문자열 입력

char* gets(char* s)

char* fgets(char* s, int n, FILE* stream)

형식 지정

출력

int printf(const* format,...)

int fprintf(FILE* stream,

     const char* format, …)

형식 지정

입력

int scanf(

    Const char* format,…)

int fscanf(FILE* stream,

    const char* format,..)

 

 feof 함수

 

#include <stdio.h>

 

int feof(FILE *stream)

호출 시 전달되는 파일 포인터가 가리키는 파일이 끝에 도달 할 경우 0이 아닌 값을 리턴한다.

 

◊ fseek 함수

#incldue <stdio.h>

 

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

파일 위치 지시자를 원하는 위치로 이동시키는 함수이다.

Stream이 가리키는 파일의 파일 위치 지시자를 시작위치 wherefrom에서부터 offset 만큼 이동한다.

 

wherefrom전달인자

whrerfrom

파일 위치 지시자를 offset 만큼 이동하기 전

SEEK_SET(0)

파일의 맨 앞으로 이동한다.

SEEK_CUR(1)

현재 위치

SEEK_END(2)

파일의 맨 끝으로 이동한다.

 

Posted by cyj4369
,

1. www.microsoft.com/express 접속 (다음과 같이 창이 뜹니다.)

 

 

 

2. web 탭을 선택합니다.

 

 

3. 보라색으로 된 Install 버튼 클릭 (2번 화면에도 보입니다.~~)

 

 

4. 웹플랫폼 설치 관리자 2.0 창 실행 (Install을 클릭하여 다운 받은 wpilauncher_n.exe 더블클릭하여 실행)

 

5. 새로운기능에 있는 전체 선택(본인의 취향에 따라 설치하실 것만 하면 되지만 저는 전체 선택하여 인스톨 합니다.)

 

 

6. 설치 클릭(5번 그림에 설치 보이시지요??)

 

7. SQL Server Express 설치계획 감지..

 - 혼합 모드 인증(응용 프로그램 개발 권장)  선택 (XP는 있었지만, Vista는 없더군요)

 

 

 

8. 암호는 설정하되 3가지 이상(영소,영대,숫자,특문 중 3개를 적용) 하여 설정한다.

비밀번호는 앞으로도 로긴할때마다 자주 쓰이므로 비밀번호 대충적지 마시고 혼합해서 적으시길 권장합니다.

 

 

 

그 후에 설치가 진행 됩니다.(설치 시간이 꽤 깁니다..)

 

 

 

9. 설치도중 메시지가 뜨면 재시작 하세요~ (재부팅후에 알아서 자동 설치됩니다.)

이렇게 한 3번정도를 해주셔야 됩니다.(설치할때 은근히 시간이 좀 길어요)

 

 

 

10. 설치 후 데이터베이스 -> 사용자지정 에서 웹플랫폼 데이터베이스 사용자 지정에 체크항목 중 3,4번째 선택

 



 

SQL Server 2008 R2 Management Studio Express 와 Management Objects(영어) 를 설치하면 저희는 MS-SQL Server 2008 R2가 전부 다 설치되어서 다음과 같은 메시지가 뜹니다. 이제 정상적으로 나머지 세부 IP주소와 방화벽 설정만 해주시면 됩니다.

 

 

 

 

11. 설치 완료 후 확인할 것

- Microsoft SQL Server 2008 R2 구성도구 폴더 안에 구성관리자가 있는지 확인

- Microsoft SQL Server 2008 R2

 

SQL Server Configuration 클릭 하여 다음과 같이 설정합니다.

 

 

12. SQL Server 구성관리자 -> SQLEXPRESS에 대한 프로토콜 공유 메모리, 명명된파이프, TCP/IP 사용

VIA제외하고 나머지는 사용으로 하되 TCP/IP는 다음과 같이 셋팅해주세요 TCP 포트는 1433 입니다.

 

 

 

 

설정뒤에 다음과 같이 다시 시작을 꼭 해주셔야 됩니다.

 

 

13. Windows 방화벽에 포트추가(설정은 스샷참조)

 

15. 방화벽설정후 다시 시작합니다.

 

16. 자신의 아이피를 서버 이름에 입력후 연결

- 아이피 보는 법은 시작 -> 실행 -> cmd 입력 후 명령 프롬프트창이 뜨면 ipconfig 를 입력하세요

(혹시나 없는 경우에는 보조프로그램 -> 명령 프롬프트가 있는지 확인해주세요~! XP 기준입니다.)

 

앗!! 잠깐만요

 

간혹가다 cmd  -> ipconfig해도 다음 그림과 같이 안되는 경우가 있습니다.

 

 

 

이럴떄는 기본적으로 ipconfig 가 깔려있는 폴더 c:\windows\system32 로 들어가셔서 해주시면 됩니다.

 


자신의 아이피 주소를 확인후에 설치가 된 SSMS에 들어가셔서 서버이름에 아이피와 앞서설정했던

로그인 아이디 암호를 적어주시면 됩니다.~! 밑에와 위에 IP가 다른 이유는 서로 다른 환경에서 하였으므로

다름을 밝힙니다. IP는 보안상 가렸습니다 양해바랍니다^^



'Development > visual studio' 카테고리의 다른 글

[MFC 트레이아이콘으로 만들기]  (0) 2012.08.19
[error C2146: 구문 오류]  (0) 2012.08.19
[MFC 트레이아이콘으로 만들기]  (0) 2012.08.18
[error LNK2005]  (1) 2012.08.18
[fatal error LNK1169]  (0) 2012.08.18
Posted by cyj4369
,

mt.exe : general error c101008a: Failed to save the updated manifest to the file ".Debug\.exe.embed.manifest". d 

솔루션을 실행해 보면 위와 같은 에러가 발생한다.


이럴 때는 라이브러리 파일의 변경이나 기타 전의 솔류션과는 다른환경일 경우에 발생하는 오류로 보여진다.


그렇기 때문에 디버그 폴더에 가서 파일들을 싹 삭제한다음에 다시 빌드를 해주면 오류가 해결되는 것을 볼 수 있다.


여기서 디버그 폴더는 솔루션 바로 밑에 있는 폴더가 아닌 프로젝트 폴더 밑에 있는 디버그 폴더안의 내용을 지워줘야 한다.

Posted by cyj4369
,
winsock을 이용한 파일 보내기(C++) 소스
 
#include<winsock2.h>
#include<stdio.h>
#include<stdlib.h>
 
#define BUFSIZE 4096
 
// 소켓 함수 오류 출력 후 종료
void err_quit(char *msg)
{
           LPVOID lpMsgBuf;
           FormatMessage(
                     FORMAT_MESSAGE_ALLOCATE_BUFFER|
                     FORMAT_MESSAGE_FROM_SYSTEM,
                     NULL, WSAGetLastError(),
                     MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
                     (LPTSTR)&lpMsgBuf, 0, NULL);
           MessageBox(NULL, (LPCTSTR)lpMsgBuf, msg, MB_ICONERROR);
           LocalFree(lpMsgBuf);
           exit(-1);
}
 
// 소켓 함수 오류 출력
void err_display(char *msg)
{
           LPVOID lpMsgBuf;
           FormatMessage(
                     FORMAT_MESSAGE_ALLOCATE_BUFFER|
                     FORMAT_MESSAGE_FROM_SYSTEM,
                     NULL, WSAGetLastError(),
                     MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
                     (LPTSTR)&lpMsgBuf, 0, NULL);
           printf("[%s] %s", msg, (LPCTSTR)lpMsgBuf);
           LocalFree(lpMsgBuf);
}
 
int main(int argc, char *argv[])
{
 
    int err;
 
           if(argc < 2){
                     fprintf(stderr, "Usage: %s <FileName>\n", argv[0]);
                     return -1;
           }
 
          
           WSADATA wsa;
           if(WSAStartup(MAKEWORD(2,2),&wsa) !=0 )
                     return -1;
 
           SOCKET senderSock = socket(AF_INET,SOCK_STREAM, 0);
    if(senderSock == INVALID_SOCKET){
                                             err_quit("socket()");
                                                                                               }
          
           // connect()
           SOCKADDR_IN senderaddr;
           ZeroMemory(&senderaddr,sizeof(senderaddr));
           senderaddr.sin_family = AF_INET;
           senderaddr.sin_port = htons(9000);
           senderaddr.sin_addr.s_addr = inet_addr("127.0.0.1");
          
           err = connect(senderSock, (SOCKADDR *)&senderaddr,sizeof(senderaddr));    
           if(err == SOCKET_ERROR) err_quit("connect()");
 
 
           //파일 열기
           FILE *fp = fopen(argv[1],"rb");
 
           if(fp== NULL)
           {
            perror("파일 입출력 오류");
            return -1;
           }
 
           //파일 이름 보내기
           char filename[256];
           ZeroMemory(filename,256);
           sprintf(filename,argv[1]);
           err = send(senderSock,filename,256,0);
           //if(err == SOCKET_ERROR) err_quit("send()");
 
 
           //파일 크기 얻기
           fseek(fp,0,SEEK_END);//파일 포인터를 파일의 끝으로 옮김
           int totalbytes = ftell(fp);
 
           printf("크기 :%d bytes\n",totalbytes); //ansi로 된 text파일에 있는 문자
 
           err = send(senderSock,(char *)&totalbytes,sizeof(totalbytes),0);
           if(err == SOCKET_ERROR) err_quit("send()");
 
 
           //파일 데이터 전송에 사용할 변수
           char buf[BUFSIZE];
           int numread;
           int numtotal = 0;
 
           //파일 데이터 보내기
 
           rewind(fp); // 파일 포인터를 제일 앞으로 이동
           while(1){
                     numread = fread(buf, 1, BUFSIZE, fp);
                     if(numread > 0){
                                err = send(senderSock, buf, numread, 0);
                                if(err == SOCKET_ERROR){
                                          err_display("send()");
                                          break;
                                }
                                numtotal += numread;
                     }
                     else if(numread == 0 && numtotal == totalbytes){
                                printf("파일 전송 완료!: %d 바이트\n", numtotal);
                                break;
                     }
                     else{
                                perror("파일 입출력 오류");
                                break;
                     }
           }
 
           fclose(fp);         
    closesocket(senderSock);
           WSACleanup();
 
return 0;
 
}
Posted by cyj4369
,
화면 처리 함수 
 
Visual C++에는 Turbo - C에서 사용할 수 있는 화면 처리 함수가 정의되어 있지 않습니다. 
이런 이유로 함수를 정의해서 이용해야 합니다. 
Turbo ? C에서는 conio.h를 인클루드 시켜 바로 사용하면 됩니다. 
gotoxy(int x, int y): x, y 좌표로 커서 이동 
wherex(): 현재 커서의 x좌표 리턴 
wherey(): 현재 커서의 y좌표 리턴 
함수를 아래와 같이 정의한 후 windows.h를 인클루드 시키면 됩니다. 
void gotoxy(int x, int y) 
     COORD Cur; 
     Cur.X=x; 
     Cur.Y=y; 
     SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),Cur); 
   
 

// 커서의 x 좌표를 조사한다. 
int wherex() 
     CONSOLE_SCREEN_BUFFER_INFO BufInfo; 
   
 

     GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE),&BufInfo); 
     return BufInfo.dwCursorPosition.X; 
   
 

// 커서의 y좌표를 조사한다. 
int wherey() 
     CONSOLE_SCREEN_BUFFER_INFO BufInfo; 
   
 

     GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE),&BufInfo); 
     return BufInfo.dwCursorPosition.Y; 
예제23) 커서를 이동시킨 후 x 좌표와 y좌표를 출력하는 프로그램 
#include <stdio.h> 
#include <windows.h> 
void gotoxy(int x, int y) 
     COORD Cur; 
     Cur.X=x; 
     Cur.Y=y; 
     SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),Cur); 
 
 

int wherex() 
     CONSOLE_SCREEN_BUFFER_INFO BufInfo; 
 
 

     GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE),&BufInfo); 
     return BufInfo.dwCursorPosition.X; 
int wherey() 
     CONSOLE_SCREEN_BUFFER_INFO BufInfo; 
     GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE),&BufInfo); 
     return BufInfo.dwCursorPosition.Y; 
int main() 
    int x, y; 
    gotoxy(30, 10); 
    x = wherex(); 
    y = wherey(); 
    printf("x좌표:%d y좌표:%d\n",x,y); 
    return 0; 
}
Posted by cyj4369
,
시스템 함수 
 
C에서는 프로그램의 실행을 종료하고 제어를 운영체제에게 돌려주는 함수와 시스템 명령을 수행할 수 있는 함수를 제공합니다. 
stdlib.h에 정의 되어 있습니다. 
 
 

1) exit 함수 
이 함수는 프로그램의 실행을 종료하고 제어를 운영체제에게 돌려주는 함수입니다. 
이 함수의 매개 변수로 0를 주면 성공을 알리고 운영체제에게 리턴하며 1을 주면 실패를 알리고 운영체제에게 제어를 넘겨주게 됩니다. 
 
 

예제21) exit()의 사용 
#include
<stdlib.h>

int main() 
    printf("Exit를호출하면이후문장은수행되지않습니다\n"); 
    exit(0); 
    printf("의미없는문장\n"); 
    return 0; 
}

 
 

2) system 함수 
운영체제의 시스템 명령을 수행할 수 있도록 해주는 함수입니다. 
예제22) system()의 사용 
#include
<stdio.h>

#include
<stdlib.h>

#include
<conio.h> 
int main() 
    printf("메모장실행\n"); 
    system("notepad.exe"); 
    printf("메모장을종료하면서자신의ping 확인"); 
    system("ping 127.0.0.1 -t"); 
    return 0; 
}
Posted by cyj4369
,
시간 관련 함수(time.h) 
 
모든 시간 함수의 원형은 time.h 헤더 파일에 선언되어 있으므로 시간 관련 함수를 사용하려면 반드시 time.h를 인클루드 해야 합니다. 
시간과 관련된 가장 기본적인 함수는 현재 시간을 구하는 time 함수이다. 
time_t time( time_t *timer ); 
char *ctime( const time_t *timer ); 
time 함수는 1970년 1월 1일 자정 이후 경과한 초를 조사하는데 리턴 타입인 time_t형은 시스템에 따라 달라지며 Windows에서는 4바이트 정수(typedef long time_t;)로 정의되어 있습니다. 
time 함수는 time_t형의 포인터를 인수로 받아 이 인수에 조사된 시간을 채워 주기도 하고 같은 값을 리턴 하기도 합니다. 
둘 중 아무 값이나 사용해도 상관없으며 리턴 값만 사용할 경우는 인수로 NULL을 전달할 수도 있습니다. 
이 함수는 최대 2038년 1월 18일까지의 날짜를 표현할 수 있으며 64비트 버전인 _time64 함수는 3000년 12월 31일까지 표현 가능합니다. 
이 함수가 조사하는 시간은 초 단위이기 때문에 이 값으로부터 우리가 일상적으로 사용하는 시간을 바로 구하기는 무척 어렵습니다. 
또한 세계 표준시 포맷으로 되어 있어 우리나라 시간과 일치하지도 않습니다. 
ctime 함수는 time_t형의 경과 초를 출력하기 편리한 문자열 형태로 바꾸며 세계 표준시로 된 시간을 지역 설정에 맞게 조정해 주기도 합니다. 
변환된 문자열은 26문자 길이로 되어 있으며 끝에 개행 문자가 있어 printf 등의 함수로 곧바로 출력할 수 있습니다. 
ctime이 변환 결과를 저장하기 위해 사용하는 버퍼는 라이브러리에서 미리 할당해 놓은 정적 메모리 영역이며 이 영역은 asctime, gmtime, localtime 등의 함수들이 공유합니다. 

예제4) 현재 시간 출력 
#include <stdio.h> 
#include <time.h> 
int main() 
time_t t; 
time(&t); 
printf("현재 시간은 %d입니다.\n", t); 
printf("현재 시간은 %s입니다.\n", ctime(&t)); 
return 0; 
}

 
 

char *_strdate(char *datestr); => 현재 날짜를 문자열로 리턴 
char *_strtime(char *timestr); => 현재 시간을 문자열로 리턴 
 
 

_strdate는 날짜를 MM/DD/YY 포맷으로 구해 datestr 버퍼에 복사하며 _strtime은 시간을 HH:MM:SS 포맷으로 구해 timestr 버퍼에 복사하는데 이 함수가 구해주는 시간은 24시간제입니다. 
두 함수로 전달되는 버퍼는 널 문자까지 고려하여 최소한 9바이트 이상이어야 합니다. 
 
 

예제5) 현재 날짜와 시간을 출력하는 예제 
#include <stdio.h> 
#include <time.h> 
int main() 
char Date[10]; 
char Time[10]; 
_strdate(Date); 
_strtime(Time); 
printf("날짜: %s, 시간: %s\n",Date,Time); 
     return 0; 
}

 
 

clock_t clock( void ); 
작업 시점의 시간을 출력해주는 함수 
처음 호출하면 0을 가지게 되고 두 번째 호출하게 되면 첫 번째 호출한 시점에서 경과한 시간을 리턴 시켜 주게 됩니다. 
예제6) for 문을 10000번 돌리는 데 걸리는 시간 
#include <stdio.h> 
#include <time.h> 
int main() 
    clock_t t1, t2; 
    int i; 
    t1=clock(); 
    for(i=0; i<10000; i++) 
    { 
        t2 = clock(); 
        printf("i=%d t2=%d\n",i,(t2-t1)); 
    } 
}

 
 

일정시간 동안 대기하는 sleep 함수 만들기 
#include
<stdio.h> 
#include
<time.h> 
void sleep(int n); 
int main() 
    int i; 
    for (i=1; i <= 10; i++) 
    { 
        printf("*"); 
        sleep(1000);      
    } 
void sleep(int n) 
    long time; 
    time = n + clock(); 
    printf("잠시대기\n"); 
    printf("%ld\n", time - clock() ); 
    while( time > clock() ) 
    {         
    } 
}



Tip. 조금 더 정확한 시간을 알고 싶다면??
STSREMTIME 구조체 사용
typedef struct _SYSTEMTIME { // st WORD wYear; WORD wMonth; WORD wDayOfWeek; WORD wDay; WORD wHour; WORD wMinute; WORD wSecond; WORD wMilliseconds; } SYSTEMTIME;
SYSTEMTIME SysTime;
GetLocalTime(&SysTime);
//%03d : 000포맷으로 빈 곳은 0으로 채움 19면 019로 표현 
printf("%02d, %03d",SysTime.wSecond, SysTime.wMilliseconds);

Posted by cyj4369
,
숫자와 문자열 변환 함수(stdlib.h) 
 
숫자와 문자열을 변환해주는 함수 
char *itoa(int value, char *string, int radix); 
int 형을 문자열로 변경 
char *ltoa(long value, char *string, int radix); 
long 형을 문자열로 변경 
char *ultoa(unsigned long value, char *string, int radix); 
unsigned long을 문자열로 변경 
 
 

예제18) itoa를 이용해서 10을 진법 별로 문자열로 변환 
#include <stdio.h> 
#include <stdlib.h> 
int main() 
    char str[100]; 
    int i = 10; 
    itoa(i,str,10); 
    printf("str = %s\n",str); 
    itoa(i,str,8); 
    printf("str = %s\n",str); 
    itoa(i,str,16); 
    printf("str = %s\n",str); 
    itoa(i,str,2); 
    printf("str = %s\n",str); 
    return 0; 
}

 
 

int atoi(const char *string); 
문자열을 정수로 변환 
숫자와 문자가 섞여 있다면 숫자가 있는 부분까지만 변환 
long atol(const char *string); 
문자열을 long 형 정수로 변환 
double atof( const char *string ); 
문자열을 double 형 정수로 변환 
long strtol(const char *nptr, char **endptr, int base); 
base 진법까지 인정해서 변경해줌. 
변환 불가능한 문자를 만나면 endptr로 리턴 
 
 

예제19) itoa를 이용해서 10을 진법 별로 문자열로 변환 
#include <stdio.h> 
#include <stdlib.h> 
int main() 
    char str[10] = "12car"; 
    int i; 
    i = atoi(str); 
    printf("i = %d\n",i); 
    i = strtol(str, NULL, 10); 
    printf("i = %d\n",i); 
    i = strtol(str, NULL, 10); 
    printf("i = %d\n",i); 
    i = strtol(str, NULL, 16); 
    printf("i = %d\n",i); 
    i = strtol(str, NULL, 8); 
    printf("i = %d\n",i); 
    i = strtol(str, NULL, 2); 
    printf("i = %d\n",i); 
 
 

    return 0; 
}
Posted by cyj4369
,
수학 함수(math.h) 
 
double sin(double x) => sin 
double cos(double x) => cos 
double tan(double x) => tan 
double sqrt(double x); => x의 제곱근 
double pow(double x, double y) => xy 
double floor(double x) => 소수 버림 (반올림은 0.5를 더한 후 소수를 버리면 됩니다. )
double ceil(double x) => 소수를 버리고 정수 값을 1증가 
int abs(int n) => 절대 값 
long labs(long n) => 절대 값 
double fabs(double x) => 절대 값 
 
예제1) 기본적인 수학 함수의 사용 
#include
<stdio.h> 
#include
<math.h> 
int main() 
int r; 
for (r=0;r<=90;r+=10) 
printf("sin(%d도)=%f\t",r,sin(r*3.1416/180)); 
    printf("cos(%d도)=%f\t",r,cos(r*3.1416/180)); 
    printf("tan(%d도)=%f\n",r,tan(r*3.1416/180)); 
    printf("25의제곱근= %.2f\n", sqrt(25)); 
    printf("5의3제곱= %.2f\n", pow(5,3)); 
    printf("5.4의소수버림결과= %f\n", floor(5.4));
    printf("5.4의소수올림결과= %f\n", ceil(5.4)); 
    printf("-5.4의소수버림결과= %f\n", floor(-5.4)); 
    printf("-5.4의소수올림결과= %f\n", ceil(-5.4)); 
    printf("5의절대값= %d\n", abs(5)); 
    printf("-5의절대값= %d\n", abs(-5)); 
    printf("5.4의절대값= %f\n", fabs(5.4)); 
    printf("-5.4의절대값= %f\n", fabs(-5.4)); 
return 0; 
}
Posted by cyj4369
,