●파일 열기

ex)

FILE * fp;

fp = fopen("파일이름", "형식");

 

 

●파일 닫기

ex)

fclose(fp);

 

 

●입력할 파일은 실행하는 코드와 같은 폴더에 위치해야 한다. 보통 비주얼스튜디오에서 New 파일추가에서 텍스트 문서를 추가하면 된다.

 

 

●출력된 파일을 확인하려면 비주얼스튜디오 좌측 파일목록에서 우클릭->Add File to Project선택후 파일이름에 *를 입력하고 ok버튼을 누른다. 그 다음 출력된 파일을 선택하면 된다.

 

 

●문제

- 파일에서 숫자 2개를 입력받아서 첫번째 숫자에서 두번째 숫자까지의 구구단을 구해서 파일로 출력하는 프로그램을 만들어라.

 #include<stdio.h>

 void main(){

 FILE *in = fopen("input.txt", "r");

 FILE *out = fopen("out.txt","w");

 int i, j, a, b;

 fscanf(in,%d %d", &a, &b);

 for(i=a; i<=b; i++){

     for(j=1;j<=0; j++){

         fprintf(out, "%d *%d = %d", i, j, i*j);

    }

 }

 fclose(in);

 fclose(out);

 }

 

 

 

 

 

 

 

 

 

'프로그래밍 > c언어' 카테고리의 다른 글

c언어 파일 입출력  (0) 2012.03.28
c언어 경고(warning)  (0) 2012.02.08
c언어 에러(error)  (0) 2012.02.08
c언어 디버그 기법  (0) 2012.02.07
c언어 텍스트 파일의 내용을 거꾸로 표시하는 프로그램 소스  (0) 2012.02.07
c언어 기본 문법 정리4  (0) 2012.02.04
Posted by -현's-

댓글을 달아 주세요


 warning C4700: local variable '.identifier' used without having been initialized
-경고 원인
.identifier 의 변수에 대해서 초기화 값을 지정하지 않고 사용하는 경우에 발생

-경고 해결
변수를 초기화 하지 않고 사용하는 것은 프로그램상에서 위험하므로 초기값을 지정해 주는 습관을 들이는게 좋다.





 warning C4001: '.identifier' : unreferenced local variable
-경고 원인
선언한 변수가 사용되지 않는 경우에 나오는 경고이다.




 warning C4244: 'conversion' conversion from 'type1' to 'type2', possible loss of data
-경고 원인
정수나 실수 등 자료형이 맞지 않은 경우 발생

-경고 해결
변수의 사용을 정수나 실수형에 알맞게 선언하고 사용





 warning C4130: '==' : logical operation on address of string constant
-경고 원인
'=='에서 비교하는 값의 종류 같지 않을 경우 발생




 warning C4715 : 'function' : not all control paths return a value
-경고 원인
예를 들어
int fun(int i){
   if(i>=0){
   return 0
  }
}
이라는 함수에서 i가 0보다 작은 값이 들어오면 return하지 않기 때문에 프로그램상에서 버그가 날수 있다.


-경고 해결
if문 밑에 else문을 만들어 모든 가능한 경로에 return 값을 넣어 주면 된다.




 warning C4307 'operator' : integral constant overflow
-경고 원인
예를 들어 int형의 최대값은 2,147,483,647 인데 여기에 30억이라는 값이 들어가게 되면 경고가 발생한다














'프로그래밍 > c언어' 카테고리의 다른 글

c언어 파일 입출력  (0) 2012.03.28
c언어 경고(warning)  (0) 2012.02.08
c언어 에러(error)  (0) 2012.02.08
c언어 디버그 기법  (0) 2012.02.07
c언어 텍스트 파일의 내용을 거꾸로 표시하는 프로그램 소스  (0) 2012.02.07
c언어 기본 문법 정리4  (0) 2012.02.04
Posted by -현's-

댓글을 달아 주세요



 error C2228: left of '.identifier' must have class/struct/union type
-에러 원인
class나 struct, union으로 선언한 변수를 사용하는 경우에 '.identitier'부분이 class, struct, union 에서 정의한 변수명이 아닌경우, 혹은 포인터를 사용하면서  '->'아니라 '.'으로 사용한 경우에 이런 에러가 발생

-에러 해결
class, struct, union 에서 선언한 변수명과 맞는ㄴ지 체크하고 포인터를 사용하는 경우 '.'이 아니라 '->'로 접근





 error C2143: syntax error : missing ';' before 'if'
-발생 원인
if문 이전에 ';'이 빠진 경우에 발생

-에러 해결
명령어가 끝나는 곳에 ';'를 붙여준다




 error C2065: '.identifier' : undeclared identifier
- 에러 원인
.identifier가 선언되지 않고 사용되는 경우에 발생

- 에러 해결
.identifier 부분 스펠링 확인, 대소문자 확인, 헤더파일이 정확히 include되었는지 확인





 error C2106: '=' left operand must be 1-value
-에러 원인
a=b의 경우에서 a족에 b의 값을 넣을 수 없는 경우에 발생





 error LNK2001: unresolved external symbol _main
 error LNK1120: 1 unresolved externals
-에러 원인
main부분을 찾을 수 없는 경우에 발생




 error C1010: unexpected end of file while looking for precompiled header directive
-에러 원인
비주얼c에서 precompiled header를 '*.c' 혹은 '*.cpp'파일에 include하지 않은 경우에 발생

-에러 해결
소스파일에 #include "stdafx.h" 추가
Project-setting0c/c++  tab Project Option text bok 에서 /Yu"stdafx.h"부분을 찾아 삭제




 error C2143: syntax error : missing ';' before '}'
 error C1004: unexpected end of file found
-에러 원인
{ 와 } 쌍이 맞지 않는 경우에 발생
C2143 에러의 경우 } 의 개수가 { 의 개수보다 많은 경우
C1004 에러의 경우 { 의 개수가 } 의 개수보다 많은 경우

-에러 해결
{ 와 } 의 개수를 맞게 조정








'프로그래밍 > c언어' 카테고리의 다른 글

c언어 파일 입출력  (0) 2012.03.28
c언어 경고(warning)  (0) 2012.02.08
c언어 에러(error)  (0) 2012.02.08
c언어 디버그 기법  (0) 2012.02.07
c언어 텍스트 파일의 내용을 거꾸로 표시하는 프로그램 소스  (0) 2012.02.07
c언어 기본 문법 정리4  (0) 2012.02.04
Posted by -현's-

댓글을 달아 주세요


●처리를 분할
식이나 문을 한번에 모아서 작성하기 보다 처리나 의미 단위로 분할하는게 좋다. 한줄에 여러개의 문을 기술하지 않는 편이 에러의 위치를 쉽게 파악할수 있다.



●printf()를 삽입
소스 프로그램에 printf()를 삽입하여 단서를 얻을 수 있다. 예를 들어 프로그램 속에 printf("이곳은 실행됨\n"); 와 같이 써두면 그곳에 도달했을 때 메시지가 출력되어 그부분이 언제 실행되는지 알수 있다. 그리고 변수의 값을 표시해두면 그 시점에서의 변수 값도 조사할 수 있다.



●함수별로 실행
c언어에서의 처리 단위는 함수이기 때문에 함수를 테스트하는 일이 많다.  정상적으로 함수가 동작하는지 알기 위해 main()함수를 바꿔 써서 대상 함수를 바로 실행시키는 방벙이 있고, 별로의 테스트용 프로그램을 만들어 그곳에서 태스트하고 싶은 함수를 호출하는 방법이 있다.



●처리의 흐름을 조절
버그가 있는 곳을 찾을 때 조건 분기가 방해가 될 경우가 있다. 조건식에 직접 true(1)이나 false(0)을 입력하는 것도 하나의 방법이다.




●디버거의 이용








Posted by -현's-

댓글을 달아 주세요

프로그램 이름: rev.c


#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <malloc.h>

typedef struct _TXT{
int number;
char string[256];
} TXT;

int main()
{
FILE *fp;
int i, lines;
char s[256];
TXT *p;


//행의 수를 카운트하여 필요한 메모리 확보
if(!(fp=fopen("rev.c", "r")))
return 1;
for(line=0; !feof(fp); lines++)
fgets(s, 255, fp);
p=(TXT *)malloc(lines * sizeof(TXT));
if(!p)
return 2;

memset(p, 0, lines * sizeof(TXT));
fseek(fp, SEEK_SET, 0);
for(o=0; i<lines; i++){
p[i].number=i;
fgets(p[i].string, 255, fp);
p[i].string[strlen(p[i].string)-1] = '\0';
}
fclose(fp);

//거꾸로 표시
for(i=lines-1; i>-0; i--)
printf("%04d: %s\n", p[i].number+1, p[i].string);
free(p);
return 0;
}




Posted by -현's-

댓글을 달아 주세요


●연산에서 조건이 true면 1을 반환, false면 0을 반환



●sizeof 연산자 - 변수나 자료형이 메모리를 점유하는 크기를 바이트 단위로 구함
ex)
int n,m;
n=sizeof(int);
m=sizeof(n);



●문자열 선언 - 배열 이용
ex)
char a[]="Hello";
char a[6]="hello";



●문자열은을 복수 문자의 집합으로 이것을 담아두기 위해서 배열을 이용한다



●문자열 함수 - 프로그램 첫머리에 #include <string.h> 써야함
- strlen() - 문자열 길이 반환
ex)
char s[]="abc";
int a;
a = strlen(s);

- strcpy() - 문자열을 복사
ex)
char s[6];
strcpy(s, "abc");

- strcat() - 문자열 결합
ex)
char a[6]="abc";
char b[]="de";
strcat(a, b);



●동적 메모리 할당 - #include<memory.h>, #include<malloc.h>, #include<stdlib.h> 써야함
ex)
①메모리 확보
short *buf;
buf=(short *)malloc(sizeof(short)*2000);   //malloc함수의 반환값은 형이 없기때문에
                                                         //buf와 같은 형으로 캐스팅한다

②메모리 이용 - 일반적인 배열처럼 사용
ex)
buf[2] = 10;

③메모리 해제
ex)
free(buf);




●파일 다루기
①파일을 연다
②읽고 쓰기 수행
③파일을 닫는다



●파일 열기 - fopen() 함수 이용
ex)
FILE *fp;
fp = fopen("파일명", "r");      //r - 읽기전용, w - 쓰기전용, a - 수가해서 쓰기


●파일 닫기 - fclose() 함수 이용
ex)
fclose(fp);



●파일 읽기 - fgets() 함수이용, 행바꿈 코드까지 읽거나 지정된 최대문자만큼 읽음
ex)
char s[10];
FILE *fp;
fp=fopen("a.txt", "r");
fgets(s, 9, fp);          //(값을 저장할 배열, 읽어올 문자수, 파일포인터);
fclose(fp);




●파일 끝가지 읽기 - feof()함수 이용, feof()는 파일포인터의 위치가 패일의 맨 끝이면 참이 되는 함수
ex)
while(1)
{
fgets(s, 9, fp);
if(feof(fp))
break;
}


●파일을 열지 못하면 파일포인터(fp)는 null값이 된다



●파일 작성 - fputs() 함수 이용, fprintf()함수 이용
ex)
FILE *fp;
fp=fopen("a.txt", "w");
fputs("기록할 문자열\n", fp);
int a=5;
fprintf(fp, "%d\n", a);



●난수 만들기 - rand(), srand() 함수 이용, #include<stdlib.h>필요















Posted by -현's-

댓글을 달아 주세요


●포인터 - 메모리의 주소값을 저장하기 위한 변수




&a - 변수 a의 주소값을 반환
*a - 포인터a가 가리키는 메모리를 참조



●*
- 곱셈
 ex) a*b
- 포인터 선언
ex) int *a
-포인터 접근
ex) *a


●배열 이름은 포인터 상수이다. 배열이름은 첫번재 요소의 주소값이다
ex)
int a[5]={~~~};   // 여기에서 'a'가 배열 이름이고 배열의 첫번째 요소의 주소를 저장하는 포인터이다



●문자열은 주소값으로 저장된다, 그래서 문자열선언은 배열을 만들어서 한다
ex)
chat a[5]="good";
char *str="abcd";




직접접근 - 변수를 통한 접근
간접접근 - 포인터를 이용한 접근




●구조체
ex)
struct A{
int x;
int y;
};
struct A a;  //구조체 변수 선언시 struct라는 키워드를 반드시 붙여줘야함
a.x=10;
a.y=20;


●구조체 선언과 동시에 초기화
ex)
struct person{
char name[20];
char phone[20];
int age;
};
struct person p1 = {"a", "0", 20);   //순서 중요
struct person p2 = { .age=20, .name-"a", .phone="1"};  //이방법은 순서 안 중요



●typedef - 이미 존재하는 자료형에 새로운 이름을 붙이기 위한 용도
ex)
typedef int INT;

typedef struct data DATA;


●구조체 정의와 typedef 동시에 선언
ex)
typedef struct DATA{
int a-1;
int b=2;
} DATA;



●메모리
데이터 영역 - 전역변수와 static변수가 할당되는 영역, 프로그램 시작 종료시
스택영역 - 지역변수와 매개변수가 저장되는 영역, 함수 호출 종료시
힙영역 - 프로그래머가 관리하는 영역, 동적할당시



●malloc, free - 힙에 할당,해제하는 함수, #include<stdlib.h>써야함



●배열 선언은 반드시 상수로 해야한다. 스택과 데이터영역에 할당될 메모리는 컴파일 하는 동안 결정되기 때문이다. 배열 길이를 변수로 선언하기 위해선 동적할당을 해야한다.

















Posted by -현's-

댓글을 달아 주세요


●서식문자
%d, %i - 부호있는 10진수 정수

%f - 부호있는 10진수 실수

%c - 단일문자

%s - 문자열

%o - 부호x, 8진수 정수

%x - 부호x, 16진수 정수

%u - 부호x, 10진수 정수




%8d - 8칸 확보하고 오른쪽 정렬

%-8 - 8칸 확보하고 왼쪽 정렬

%+8d - 8칸 확보하고 오른쪽 정렬한상태에서 +나 -기호 붙임



●while 반복문
while(반복조건){
내용
}



●for반복문
for(초기문; 조건문; 증감문) {
내용



●if 조건문
if(조건){
내용



●if~else 조건문
if(조건) {
내용
}
else if(조건) {
내용
}
else
{
내용
}



●조건 연산자
조건 ? A : B       //조건이 true면 A반환, 조건이 false면 B반환




●switch 문
ex)
int n;
scanf("%d", &n);

switch(n)         //switch문에 전달되는 인자는 int형 또는 char형 정수가 되어야 한다.
{
case 1:
         printf("~~~");
         break;
case 2:
         printf("~~~");
         break;
default:                    //default문은 반드시 존재해야하는 것은 아니므로 필요에 따라 선언하면 된다.
printf("~~~");
}


●void 는 '없다'는 뜻이다



●함수의 원형(프로토타입) 선언 - 함수를 호출하기 전에 원형을 선언해야 한다
ex)
int Add(int a, int b);    //원형 선언
int main(){
Add(3,4);
return 0;
}
int Add(int a, int b);
{
int result=a+b);
return result;
}



●지역변수는 전역변수에 우선한다.

가급적 지역변수와 전역변수의 이름을 다르게 선언하는 것이 좋다.

전역변수를 많이 쓰게 되면 프로그래밍이 복잡해지므로 가급적 꼭 필요하지 않으면 안 쓴느게 좋다



●배열 선언
ex)
int a[5] = {1, 2, 3, 4, 5};
int b=[] = {1, 2, 3, 4, 5};    //자동으로 컴파일러가 []안에 값을 넣어준다
int c[5] = {1, 2}     //나머지는 0으로 채워짐



●문자열 선언
ex)
chat str1[5] = "Good";
char str2[] = "morning";  //첫번째보다 두번째가 더 일반적이다, 숫자셀 필요 없기 때문



●\0 - 아스키코드로 0, 널문자이다.





char str[100];
scanf(%s", str);     //문자열을 입력 받을땐 &안붙인다. str자체가 주소를 가지고 있기 때문








Posted by -현's-

댓글을 달아 주세요


●c언어의 기본구조
ex)
#include<stdio.h>
int main(){
printf("Hello World\n");
return 0;
}



●주석
//~~

/*   
~~
 */




●서식문자
%d - 정수
%c - 문자
%s - 문자열
%f - 실수
.
.
.


●변수 이름은 대소문자 구분, 될수 있으면 의미를 지니는 이름으로 지정하는게 좋다



●";(세미콜론)"은 문장의 끝을 나타냄



●변수를 선언할 경우 변수를 사용하기전에 먼저 선언해야 한다




++a - 선 증가, 후연산
a++ - 선 연산, 후증가



●읽기 쓰기
ex)
int val;
scanf("%d", &val);       //scanf에서는 &사용해야한다
printf("%d", val);


●컴퓨터는 내부적으로 int형 연산을 가장 빠르게 처리한다




●double형으로 데이터를 입력 받으려면 scanf에서 %f가 아니라 %lf 사용
ex)
scanf("%lf", &a);



●상수는 일반적으로 대문자로 써주는게 관례이다



●일반적으로 정수현은 int, 실수형은 double를 쓴다



●프로그램 상에서 문자를 표현할때는 ''(따온표)를 붙인다
ex)
char a='A';
char b=65;
printf("%d%d", a, b);            //65 65로 출력된다, %d면 숫자료 표현
printf("%c%c, a, b);             //A A로 출력된다, %c면 문자로 표현




●문자 표현할때는 char형으로 충분히 표현할수 있으므로 int대신 char쓴다.

int형 변수가 char보다 빠르게 처리하는 것은 연산이다. 문자로 연산할 일이 없으므로

char형 변수를 쓰는것이 좋다




●심볼릭 상수 - 'const' 키워드 이용, 반드시 선언과 동시에 초기화 해야한다
ex)
const int MAX = 100;









Posted by -현's-

댓글을 달아 주세요


1. 간단한 도서 관리용 프로그램을 작석해 보자. [제목, 저자, 페이지수]에 대한 정보를 저장할 수 있는 구조체를 정의하고,
구조체 배열을 선언해서 도서에 대한 정보를 저장하는 구조를 작성해 보자.main함수는 사용자로부터 3권의 도서에 대한 정보를 입력받고, 입력이 끝나면
도서에 대한 내용을 출력해 주도록 구현을 하자.

#include<stdio.h>
struct book
{
char juja[100];
char name[100];
int page;
};

int main()
{

int i;
struct book a[3];

printf("도서정보입력\n");

for(i=0; i<3; i++)
{
printf("저자:\n");
scanf("%s", a[i].juja);

printf("제목:\n");
scanf("%s", a[i].name);

printf("페이지수:\n");
scanf("%d", &a[i].page);
}

printf("도서정보출력:\n");
for(i=0; i<3; i++)
{
printf("book%d 저자:%s, 제목: %s, 페이지수: %d\n", i+1, a[i].juja, a[i].name, a[i].page);
}

return 0;
}


2. 도전1에서 구현한 프로그램에 변경을 조금 가하자. 구조체 배열을 선언하는 것이 아니라, 구조체 포인터 배열을 선언하고 구조체 변수를
동적으로 할당하는 형태로 프로그램을 재구성해 보자.


#include<stdio.h>
#include<stdlib.h>

struct book
{
char juja[100];
char name[100];
int page;
};

int main()
{

int i;
struct book *a;

a=(struct book*)malloc(sizeof(struct book)*3);

printf("도서정보입력\n");

for(i=0; i<3; i++)
{
printf("저자:\n");
scanf("%s", a[i].juja);

printf("제목:\n");
scanf("%s", a[i].name);

printf("페이지수:\n");
scanf("%d", &a[i].page);
}

printf("도서정보출력:\n");
for(i=0; i<3; i++)
{
printf("book%d 저자:%s, 제목: %s, 페이지수: %d\n", i+1, a[i].juja, a[i].name, a[i].page);
}

free(a);


return 0;
}


3. 복소수를 나타내는 구조체를 정의하고, 복수수 덧셈과 곱셈을 위한 함수를 각각 정의하자.
그리고 main 함수에서는 두 개의 복소수를 사용자로부터 입력받아서 덧셈과 곱셈 연산의 결과를 출력해 주는 프로그램을 작성하자


#include<stdio.h>

struct cn {
 double a;
 double b;
};

int main()
{
 struct cn cn1, cn2;

 printf("복소수 입력(실수, 허수)\n");
 scanf("%lf %lf", &cn1.a, &cn1.b);
 
 printf("복소수 입력(실수, 허수)\n");
 scanf("%lf %lf", &cn2.a, &cn2.b);

 

 printf("합의 결과]실수부: %lf, 허수부:%lf \n", cn1.a+cn2.a, cn1.b+cn2.b);
 printf("곱의 결과]실수부: %lf, 허수부:%lf \n", cn1.a*cn2.a-cn1.b*cn2.b, cn1.b*cn2.a+cn1.a*cn2.b);


 return 0;
}

 

Posted by -현's-

댓글을 달아 주세요