C 언어에서 fget() 을 활용하여 간단하게 입력을 받는 방법을 기록하려 한다.

 

fget() 은 스트림에서 문자열을 읽어 들이는 함수인데~ sscanf() 와 함께 아래 코드와 같이 사용 할 수 있다.

 

아래 코드는 숫자 두 개를 받아서 간단하게 라인 수를 넣고 그 합을 출력해 주는 코드이다.

 

#include <stdio.h>

 

#define    TEXTLENGTH    2048

 

int    main()

{

char    text[TEXTLENGTH] ;

double    xi, yi ;

int        n=1;

 

while (fgets (text, TEXTLENGTH, stdin) != NULL )

{

if (sscanf (text, "%lf %lf", &xi, &yi ) == 2 )

{

    printf("%d, %lf+%lf=%lf\n",n, xi, yi, xi+yi);

    ++n ;

}

else

{

    fprintf( stderr, "Data Number Error : %s", text ) ;

}

}

return 0 ;

}

 

일단 현재 내 컴퓨터 환경은 윈도우 7, 64 비트이고 mingw 가 설치되어 있다.

 

위 코드의 파일 명은 standardIO.c 인데~ 다음과 같이 CMD 창에서 컴파일 한다.

 

gcc standardIO.c -o standardIO

 

다음으로 입력을 위한 test.txt 파일을 다음과 같이 만들었다. 단순히 탭으로 구분된 숫자 두 개씩 저장한 것이다.

 

아래 명령어로 test.txt 파일의 내용을 standardIO.exe 에 넣어주면~

 

standardIO.exe < test.txt

 

아래와 같은 결과가 나온다.

 

아래와 같이 명령하면~

standardIO.exe < test.txt > result.txt

 

result.txt 파일이 다음과 같이 만들어 지기도 한다.

 

아래 그림과 같이 standardIO.exe 를 실행하고~ cmd 창에 숫자를 넣어서 계산 할 수도 있다. 종료는 Ctrl + C 를 누르면 된다.


윈도우에서 GCC 를 사용하고자 하는 경우 MinGW 를 사용하거나 Cygwin 을 설치하거나 또는 Virtual box 에 리눅스를 설치해서 사용할 수 있다.

 

아래 포스팅에서 TDM-GCC 설치 방법에 대해 소개한 적이 있는데~

  

2013/06/06 - [유틸] - MinGW 64bits 설치


오늘은 MinGW 뿐만 아니라 boost 라이브러리를 사용하고 싶었다.

 

현재 내 PC 환경은 윈도우 7 64비트이다.

 

찾아보니 아래 주소의 MinGW Distro 가 나왔고, x64-native, GCC 4.8.2, Boost 1.55.0 라는 특징을 가지고 있었다.

 

http://nuwen.net/mingw.html

 

또한 C++11 을 default 로 설정해 놓았다고 한다.

 

위 주소에 들어가서 아래 그림의 링크를 클릭해서 다운로드 받는다. 위에 링크된 mingw-11.6.exe 은 git 이 없는 버전이고

 

아래에 있는 mingw-11.6-without-git.exe 은 말 그대로 git 은 빠진 버전이다.

 

나는 git 은 따로 설치를 했었기에 아래에 있는 mingw-11.6-without-git.exe 를 다운로드 받았다.

 

설치는 굉장히 간단한데~ 다운로드 받은 mingw-11.6-without-git.exe 파일을 더블 클릭하고 아래 그림과 같이 path 를 잡아 주면 된다.

 

위 그림과 같이 최상위 폴더를 잡아주면 C:\ 하위에 MinGW 라는 폴더가 생긴다. 그래서 나는 C:\MinGW 에 설치했다.

 

윈도우에서 Codeblocks IDE 에서 boost library 를 사용하여 소문자를 대문자로 변환해 보았다.

 

소문자를 대문자로 변환하는 과정에서 아래 주소에서 확인한 boost 라이브러리의 to_upper() 함수를 사용했다.

 

http://stackoverflow.com/questions/735204/convert-a-string-in-c-to-upper-case

 

Codeblock 셋팅시에 Compiler 를 다음과 같이 방금 설치한 MinGW Distro 에 맞게 설정 해준다.

 

Compiler 의 search directory 역시 아래 그림과 같이 mingw 의 include path(C:\MinGW\include)를 추가해준다.

 

아래와 같이 코딩하고~

 

#include <iostream>

#include <boost\algorithm\string.hpp>

#include <string>

 

using namespace std;

 

int main()

{

 

string str = "Hello World";

 

string newstr = boost::to_upper_copy<string>(str); // 대문자로 변경후 새로운 변수에 저장

 

cout << "before upper : " << str << ",\t to upper : " << newstr << endl;

 

boost::to_upper(str); // // 대문자로 변경후 현재 변수에 저장

 

cout << "Str to upper : " << str << endl;

 

return 0;

}

 

F9 를 눌러서 Build And Run 을 수행해 보면 다음과 같이 정상적으로 동작 한다.



C/C++ 을 사용하여 우리가 흔히 사용하는 ls 또는 dir 명령과 같이 directory 의 파일 또는 폴더의 리스트를 얻고 싶어서 찾아보니

 

아래 주소의 글이 나오더군요. 역시… stackoverflow

 

http://stackoverflow.com/questions/612097/how-can-i-get-a-list-of-files-in-a-directory-using-c-or-c

 

boost 와 같은 매우 좋은 라이브러리를 사용하는 방법도 있지만 첫번째 답변에 dirent.h 파일을 사용하는 방법이 설명 되어 있었습니다.

 

dirent.h 는 C POSIX library 에 포함되어 있으며 MinGW 나 GCC 등에서는 사용할 수 있지만 Visual Studio에서는 사용할 수 없더군요.

 

http://stackoverflow.com/questions/5530933/dirent-h-in-visual-studio-2010-or-2008

 

사실 이런 파일 리스트와 관련한 함수들은 Cross Platform 으로 구성되어야 코딩하기 편한데 각 플랫폼에 따라 다르게 코딩하는 방법을 알아야 된다는 게 귀찮더군요.

 

그런데 역시.. dirent.h 는 Visual Studio 에서 사용할 수 있도록 아래 주소에 API 가 있었습니다.

 

http://www.softagalleria.net/dirent.php

 

또한 첫 번째로 소개했던 주소에 Visual Studio 에서 사용 할 수 있는 dirent.h 의 링크가 있더군요.

 

http://www.softagalleria.net/download/dirent/

 

몇 가지 파일 중 dirent-1.11.zip 파일을 다운로드 받았고~ Codeblock 을 사용하여 빌드 해 봤습니다.

 

필요하신 분들을 위해 dirent-1.11.zip 파일도 올립니다.

  

dirent-1.11.zip


빌드 후에 아래 그림과 같이 dirTest.exe C:\Windows 라고 명령해서 C:\Windows 의 파일리스트를 확인해 봤습니다.

 

잘 되더군요.

아래 포스팅에서 소개를 했지만 C++ 의 발전은 정말 눈부신 것 같습니다.

 


2012/08/26 - [컴퓨터일반] - C++11 많이 좋아졌네요.

 


예전에 그리 어렵게 했던 또는 귀찮게 했던 것들이 하나 하나 쉬워지는 모습을 보면서 참…. 세상은 계속 좋아지는구나 라는 생각을 많이 하는데요~

 

오늘은 간단하게 아래 주소에서 소개하는 range based for loops 에 대해 소개 드리려 합니다.

 

http://www.cprogramming.com/c++11/c++11-ranged-for-loop.html

 

아래 포스팅의 cartesian.h 파일에서도 range based for loops 를 사용했는데요~ 참 편리하긴 하더군요.


2014/03/01 - [programming language/C/C++] - C++ Cartesian Product


 

C++ 의 vector 와 같은 container 에 대해 for 문 등을 돌릴 때 iterator 를 이용하던 인덱스를 이용하던 해야 했었는데 간단하게 아래 예와 같이 for 문을 돌릴수가 있습니다… 너무 간단해서 이게 C++ 맞나 하는 생각이 들더군요.

 

vector<int> vec;

vec.push_back( 10 );

vec.push_back( 20 );

 

for (int i : vec )

{

cout << i;

}

 

벡터 내의 값을 바꾸고 싶을 때는 다음과 같이 & 기호를 사용해서 이용하면 되고~

 

for (int& i : vec )

{

i++; // increments the value in the vector

}

 

int 라는 타입 조차 생각해서 써주기 귀찮다 하면 auto 라는 키워드를 사용해서 다음과 같이 작성 할 수 있습니다.

 

for (auto& i : vec )

{

i++; // increments the value in the vector

}

 

위 예들은 C++11에서 추가된 기능이니 만큼 최신의 컴파일러를 사용해야 합니다. 저는 gcc (tdm64-2) 4.8.1 을 사용하고 있고 아래 그림과 같이 codeblock 에서 C++11 Compiler Flag 를 체크 했습니다.





윈도우에서 gcc 를 사용할 때 저는 아래와 포스팅에서 밝힌 바와 같이 codeblock을 주로 사용합니다.

 


2012/10/14 - [유틸] - Codeblock doxygen plugin DoxyBlocks


2012/08/26 - [컴퓨터일반] - CodeBlock 에서 FFTW 라이브러리를 사용한 FFT 실습


2012/07/31 - [컴퓨터일반] - Codeblock 에서 DLL 사용하기



codeblock 과 mingw 를 통해 GCC 를 사용하지만, 역시나 IDE 를 사용하여 개발하는데 익숙하다 보니

 

Command Line 을 통한 빌드에는 참 익숙해 지지가 않더군요.

 

그래도 열심히 makefile 도 만들어 보고 command line 을 통한 빌드에 익숙해 지려고 노력하고 있습니다.

 

간단하게 아래 그림과 같은 코드에 C++ 코드에 대한 빌드시~

 

<main.cpp>

#include <iostream>

#include <cstdio>

#include "test.h"

 

using namespace std;

 

int main()

{

cout << "Hello world! make test" << endl;

cout << TTTT << endl ;

getchar();

return 0;

}

 

< test.h>

#ifndef TEST_H_INCLUDED

#define TEST_H_INCLUDED

#define TTTT (5678)

#endif // TEST_H_INCLUDED

 

makefile 은 다음과 같습니다.

 

< makefile>

WORKDIR = %cd%

 

CC = gcc.exe

CXX = g++.exe

AR = ar.exe

LD = g++.exe

WINDRES = windres.exe

 

INC =

CFLAGS = -Wall -fexceptions

RESINC =

LIBDIR =

LIB =

LDFLAGS =

 

INC_RELEASE = $(INC)

CFLAGS_RELEASE = $(CFLAGS) -O2

RESINC_RELEASE = $(RESINC)

RCFLAGS_RELEASE = $(RCFLAGS)

LIBDIR_RELEASE = $(LIBDIR)

LIB_RELEASE = $(LIB)

LDFLAGS_RELEASE = $(LDFLAGS) -s

OBJDIR_RELEASE = obj\\Release

DEP_RELEASE =

OUT_RELEASE = bin\\Release\\Test.exe

 

OBJ_RELEASE = $(OBJDIR_RELEASE)\\main.o

 

all: release

 

clean: clean_release

 

 

before_release:

    cmd /c if not exist bin\\Release md bin\\Release

    cmd /c if not exist $(OBJDIR_RELEASE) md $(OBJDIR_RELEASE)

 

after_release:

 

release: before_release out_release after_release

 

out_release: $(OBJ_RELEASE) $(DEP_RELEASE)

    $(LD) $(LDFLAGS_RELEASE) $(LIBDIR_RELEASE) $(OBJ_RELEASE) $(LIB_RELEASE) -o $(OUT_RELEASE)

 

$(OBJDIR_RELEASE)\\main.o: main.cpp Test.h

    $(CXX) $(CFLAGS_RELEASE) $(INC_RELEASE) -c main.cpp -o $(OBJDIR_RELEASE)\\main.o

 

clean_release:

    cmd /c del /f $(OBJ_RELEASE) $(OUT_RELEASE)

    cmd /c rd bin\\Release

    cmd /c rd $(OBJDIR_RELEASE)

 


makefile 이 들어있는 폴더에서 간단하게 다음과 같이 mingw32-make 라고 명령어를 쳐 넣어 주면~ 아래 그림처럼 간단하게 빌드가 되더군요.

 

물론 mingw32-make.exe 가 들어있는 폴더가 system path 로 잡혀 있어야 겠죠~

 

 

 


Cygwin 을 깔면~ 윈도우에서 리눅스 관련 명령어들을 이용할 수 있습니다.

 

아예 Virtual box 등을 통해 윈도우 내에 리눅스를 깔아서 사용하는 방법도 있지만 간단한 작업을 할 때는 Cygwin 정도가 제격이라는 생각이 들더군요~

 

공식 홈페이지는 아래와 같구~

http://www.cygwin.com/

 

아래 페이지에서 setup.exe 를 클릭하면 설치 파일이 다운로드 됩니다.

http://cygwin.com/install.html

 

설치 파일을 실행해서~ 다음 다음~ 누르다 보면 설치가 진행되는데~

 

설치 과정중에 아래와 같이 packages를 설정하는 부분에서 아래와 같이 gcc 로 찾기하면 아래와 같이 나옵니다.

 

devel 폴더가 개발과 관련한 설치 파일들이 있는 폴더 입니다.

 

여기서 설치하고자 하는 package 들을 선택합니다. Skip 이라고 된 부분을 클릭하면 버전이 바뀝니다. 전 첨에 이 간단한 걸 몰라서 어디 클릭해야 하는 건가 한참 찾음 ㅡㅡ;

 

아래와 같이 gcc 관련 package 들을 선택해주고

 

아래 그림처럼~ editor 로 사용할 vi 관련 package 들을 선택해 줍니다.

 

 

그리고 다음 ~ 다음~ 을 눌러서 Cygwin 설치를 마무리 합니다. 설치에 시간이 좀 걸리니깐~ 느긋이 커피 한잔 하면서 기다리시면 됩니다.

 

이제~ Cygwin 환경에서 간단하게 C 코딩을 해 보죠~

 

Cygwin 을 실행 시키고 일단 현재 폴더가 어딘지를 보려면~

 

다음과 같이 pwd 명령을 치면 됩니다.

 

위 그림의 \home\Administrator 폴더는 사실 윈도우의 C:\cygwin\home\Administrator폴더를 의미합니다.

 

즉~ C:\cygwin\home\Administrator 폴더가 cygwin 에서는 \home\Administrator 폴더로 마운트 되었다는 의미입니다.

 

그리고 위 그림처럼 gcc –version 이라는 명령어를 쳐서 gcc 가 제대로 깔렸는지 확인합니다.

 

이제 C 코딩을 해보죠~

 

아래 그림처럼 vim hello.c 라는 명령을 쳐서~ 다음과 같이 코딩합니다. ㅋㅋ 맞습니다. hello world입니다. ㅋㅋ

 

#include <stdio.h>

int main(void) {

printf("Hello world!!\n");

return 0;

}

 

아!! Vim 사용방법을 모르시는 분들은 그냥 메모장에다 위 코드 써서 C:\cygwin\home\Administrator\hello.c 로 저장해도 됩니다.

 

이제 다음과 같이 ~~

 

gcc 로 빌드해서 hello.exe 라는 실행 파일을 만들어주고~

 

gcc hello.c -o hello

 

아래 명령어로 실행을 시키면~

 

./hello.exe

 

Hellow world!! 가 실행 됩니다~

+ Recent posts