반응형

명령어 라인으로 주어진 2개의 텍스트 파일을 합하여 하나의 파일로 만드는 프로그램을 작성하라.


argc는 argument의 수, argv는 argument가 char 형 문자열로 저장되는 포인터 배열입니다.

argv[0]은 무조건 실행 파일의 경로가 저장되고 argv[1]부터는 사용자가 입력한 인수가 저장되는데

공백문자(' ')로 분리됩니다. 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include <stdio.h>
#include <stdlib.h>
#define SIZE 100
int main(int argc, char *argv[])
    FILE *fp1=NULL;
    FILE *fp2=NULL;
    FILE *fp3=NULL;
    char line[SIZE];
    if((fp1=fopen(argv[1],"r"))==NULL)
    {
        printf("file open error1\n");
        exit(1);
    }
    if((fp2=fopen(argv[2],"r"))==NULL)
    {
        printf("file open error2\n");
        exit(1);
    }
    if((fp3=fopen(argv[3],"a"))==NULL)
    {
        printf("file open error3\n");
        exit(1);
    }
    while(!feof(fp1))
    {
        fgets(line,SIZE,fp1);
        fputs(line,fp3);
    }
    while(!feof(fp2))
    {
        fgets(line,SIZE,fp2);
        fputs(line,fp3);
    }
    printf("\n%s %s를 합하여 %s를 작성하였습니다.\n",argv[1],argv[2],argv[3]);
    fclose(fp1);
    fclose(fp2);
    return 0;
}
cs







반응형

'컴퓨터 & 프로그래밍 & 전자공학 > C언어' 카테고리의 다른 글

문자열 동적 메모리  (0) 2017.02.21
양의 정수들의 합  (0) 2017.02.21
단어 바꾸기  (0) 2017.02.18
특정 단어 찾기  (0) 2017.02.18
텍스트 파일과 이진 파일  (0) 2017.02.17
반응형

텍스트 파일을 읽어서 각 줄의 앞에 줄 번호를 붙이는 프로그램을 작성하라. 줄 번호는 폭이 6이고 오른쪽 정렬되도록 하라.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define SIZE 100
int main(void)
{
    FILE *fp = NULL;
    char arr[SIZE];
    char name[SIZE];
    int num = 1;
    printf("파일 이름: ");
    gets(name);
    if ((fp=fopen(name,"r"))==NULL)
    {
        printf("파일 오픈 실패\n");
        exit(1);
    }
    while (!feof(fp))
    {
        fgets(arr, SIZE, fp); //fgets함수는 개행문자까지 받는다.
        if (arr[strlen(arr) - 1== '\n')
            {
                arr[strlen(arr) - 1= '\0';
            }  //따라서 개행문자가 출력되므로 개행문자를 NUL문자로 바꿔준다.
        printf("%6d: ", num); //폭6 오른쪽정렬
        puts(arr);
        num++;
    }
    fclose(fp);
    return 0;
}
cs





반응형
반응형

사용자로부터 받은 파일 이름으로 텍스트 파일을 연 후에 파일 안에 들어 있는 인쇄 가능한 문자들의 개수를 계산하여 출력하라.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#define SIZE 100
int main(void)
{
    FILE *fp=NULL;
    char name[SIZE];
    char buf[SIZE];
    int count=0;
    int i=0;
    printf("파일 이름을 입력하세요: ");
    gets(name);
    if((fp=fopen(name,"r"))==NULL)
    {
        fprintf(stderr,"파일오픈오류\n");
        exit(1);
    }
    while(!feof(fp))
    {
        fgets(buf,SIZE,fp);
        for(i=0;buf[i]!='\0';i++)
        {
            if(isprint(buf[i])) //0이아니면프린트가능,0이면프린트불가 (아스키 32~126)
            count++//공백' '은 세어지고 탭(\t)은 안 세어지고 \n도 안 세어진다.
        }
    }
    printf("인쇄 가능한 문자의개수는 %d개입니다.\n", count);
    return 0;
}
cs


직접 세어보세요. 공백 (' ') 은 세어지고 탭 (\t)은 안 세어지고 줄바꿈(\n) 도 안 세어집니다.









반응형

'컴퓨터 & 프로그래밍 & 전자공학 > C언어' 카테고리의 다른 글

줄 번호 붙이기  (0) 2017.02.17
사용자 입력 텍스트 파일 저장  (0) 2017.02.13
성적 평균 구하기  (0) 2017.02.12
텍스트 파일 비교  (0) 2017.02.11
fgets 함수  (0) 2017.02.11
반응형
다음과 같이 학생들의 교과목 성적이 저장되어 있는 텍스트 파일을 읽어서 성적의 평균을 구하여 파일에 쓰는 프로그램을 작성하라. 평균은 소수점 2자리까지 출력하도록 하라. 정렬 방법은 다음의 그림을 참고하라.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <stdio.h>
#include <stdlib.h>
#define SIZE 20
int main(void)
{
    FILE *fp1=NULL;
    FILE *fp2=NULL;
    char name[SIZE];
    double korean, math, english;
    korean=0.0;math=0.0;english=0.0;
    if((fp1=fopen("grade.txt","r"))==NULL)
    {
        printf("잘못된 입력1\n");
        exit(1);
    }
    if((fp2=fopen("average.txt","a"))==NULL)
    {
        printf("잘못된 입력2\n");
        exit(1);
    }
    fscanf(fp1,"%*s\t%*s\t%*s\t%*s",name,&korean,&math,&english); //첫줄스캔하지않기위해서 *이용
    fprintf(fp2,"이름    평균\n");
    while(!feof(fp1))
    {
        fscanf(fp1,"%s\t%lf\t%lf\t%lf",name,&korean,&math,&english);
        fprintf(fp2,"%s\t%.2lf\n",name,(korean+math+english)/3);//.2lf는소수점둘째까지
    }
    return 0;
}
cs



grade 파일에 현재 파일포인터가 위치한 곳에서 엔터(\n)를 치고 프로그램을 실행하면(즉 파일포인터를

호도기 아랫줄 처음부분에 두게되면) average파일에서 호도기가 2번 출력되는데

왜그런건지는 잘 모르겠습니다.. 아시는 분 댓글좀


>>


먼저 fgets 함수를 살펴보면

char *fgets(char *str, int num, FILE *stream);

이고 스트림에서 num-1 개의 문자를 입력 받을 때 까지나, 개행문자(\n)나 파일의 끝(EOF)에 도달할

때 까지 입력받아서 문자열로 저장을 합니다. (\0문자가 자동으로들어가서 num-1개)

fgets 는 오직 개행 문자에 의해서만 입력이 끝나서 띄어쓰기도 가능합니다.

리턴값은 성공했을 경우 str입니다. 만약 파일의 끝(EOF)에 도달하였을 경우 아무런 문자도 읽지 못했다면

str의 내용은 변하지 않고 그 대신 null 포인터가 리턴됩니다. 

따라서 grade 파일에서 호도기 라인에서 enter를 한번 더 친다면 마지막 줄은

아무 내용이 없지만(내용이 없는 라인) 아직 파일의 끝이 아닌 경우가 됩니다. fgets는 아무런 문자를 읽지 못했고,

(아무것도읽지는못했지만 드디어 파일의 끝(EOF)에는도달함) 따라서 전의 str인 호도기가 한번더 출력됩니다. 

따라서 fgets를 하기전 if문으로 fgets의 리턴값이 NULL인지 검사해보고

printf 를 해주는 것이 바람직 할 것입니다. if (fgets(str, sizeof(str), fp) != NULL) printf("%s", str);

fscanf도 마찬가지입니다. 내용이 없는 라인에서는 scan할 것이 없으니 전에 scanf 했던것이 한번 더 print 되고

그다음에 드디어 파일의 끝(EOF) 에 도달했기 때문에 feof에 걸리는 것입니다.


입력파일의 마지막줄 뒤에 화이트스페이스(빈칸,탭,줄바꿈등)가 있으면 

(마지막줄-1)번째(즉파일포인터만깜빡거리는줄) scanf가 파일끝에 도달하지 못합니다.


지식인 링크 하나 올립니다. 정말 설명이 잘되어있습니다.

http://kin.naver.com/qna/detail.nhn?d1id=1&dirId=1040101&docId=67701571&qb=ZnNjYW5mIOuRkOuyiA==&enc=utf8§ion=kin&rank=4&search_sort=0&spq=0






반응형

'컴퓨터 & 프로그래밍 & 전자공학 > C언어' 카테고리의 다른 글

사용자 입력 텍스트 파일 저장  (0) 2017.02.13
인쇄 가능 문자 수 세기  (0) 2017.02.13
텍스트 파일 비교  (0) 2017.02.11
fgets 함수  (0) 2017.02.11
파일 복사  (0) 2017.01.31
반응형

두 개의 텍스트 파일을 서로 비교하는 프로그램을 작성하여 보자. 파일의 이름은 사용자에게 입력받는다. 만약 두개의 파일이 일치하면 "파일은 서로 일치함"을 출력하며 일치하지 않으면 일치하지 않는 첫 번째 문장을 다음과 같이 출력한다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define SIZE 100
int main(void)
{
    FILE *fp1;
    FILE *fp2;
    char a[SIZE];
    char b[SIZE];
    char f1[SIZE];
    char f2[SIZE];
    int bytes=0;
    printf("첫번째 파일 이름: ");
    gets(a);
    printf("두번째 파일 이름: ");
    gets(b);
    if((fp1=fopen(a,"r"))==NULL)
    {
        fprintf(stderr,"파일 열기 오류1\n");
        exit(1);
    }
    if((fp2=fopen(b,"r"))==NULL)
    {
        fprintf(stderr,"파일 열기 오류2\n");
        exit(1);
    }
    while(1)
    {
    fgets(f1,sizeof(f1),fp1); //fgets는 \n(개행문자) 나올 때까지 문자열을 받음 
    fgets(f2,sizeof(f2),fp2);
    if(strcmp(f1,f2)!=0// f1이 크면 양, f2가 크면 음, 같으면 0
    {
        printf("<< %s\n", f1);
        printf(">> %s\n", f2);
        break;
    }
    if(feof(fp1)!=0// 파일의 끝이면 not0, 끝이 아니면 0
    {
    printf("파일은 서로 일치함\n");
    break;
    }
    }
    return 0;
}
cs

만약 일치하지 않는 모든 문장을 나타내고 싶으면 strcmp 가 들어간 if 문에서 break; 만 빼주면 될 것이다.




반응형

'컴퓨터 & 프로그래밍 & 전자공학 > C언어' 카테고리의 다른 글

인쇄 가능 문자 수 세기  (0) 2017.02.13
성적 평균 구하기  (0) 2017.02.12
fgets 함수  (0) 2017.02.11
파일 복사  (0) 2017.01.31
대문자로 변경  (0) 2017.01.31
반응형

하나의 파일을 다른 이름의 파일로 복사하는 프로그램을 작성하라. 이진 파일이라고 가정하고 fread()와 fwrite()를 사용한다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <stdio.h>
#include <stdlib.h>
#define SIZE 100
int main(void)
{
    FILE *fpr=NULL;
    FILE *fpw=NULL;
    char buff[SIZE];
    int count=0;
    if((fpr=fopen("first.bin","rb"))==NULL)
    {
        printf("잘못된 파일 열기1\n");
        exit(1);
    }
    if((fpw=fopen("second.bin","wb"))==NULL)
    {
        printf("잘못된 파일 열기2\n");
        exit(1);
    }
    while((count=(fread(buff,sizeof(char),SIZE,fpr)))!=0)
    {
        printf("%d",count); //몇 개 세었는지 보려고
    fwrite(buff,sizeof(char),count,fpw);
    }
    return 0;    
}
cs

buff 와 fread 나 fwrite 를 쓸 때 덩어리의 크기를 int로 하면 오류가 생길 수 있습니다. 중간에 잘리는 경우(예를들어 09에서 0과 9사이에서 잘리는 경우)

데이터가 손실되는 것을 경험하였습니다. 따라서 1byte 단위인 char로 하는 것이 가장 안전합니다. (촘촘이 자르는 것이 가장 안전하겠죠??)

예를들어 int 형으로 한다면

1000100 을 복사하면 앞의 1000만 복사가 됩니다. 뒤에 100은 덩어리 (4byte) 가 꽉 안차서 손실이 되는 것 같아요 (정확한 것 아님 결과로부터 추론한 것임 (출력값은 1이됨)

정확한 것을 아시는 분은 댓글로 달아주세요)

그런데 10001000 을 하면  10001000 이 복사되고 출력값은 2가됩니다. 따라서 덩어리를 다 채워줘야 하는 것 같습니다.






반응형

'컴퓨터 & 프로그래밍 & 전자공학 > C언어' 카테고리의 다른 글

텍스트 파일 비교  (0) 2017.02.11
fgets 함수  (0) 2017.02.11
대문자로 변경  (0) 2017.01.31
텍스트 파일 비교  (0) 2017.01.31
암호화와 복호화  (0) 2017.01.16
반응형

텍스트 파일을 열어서 파일 안에 들어 있는 문자들을 모두 대문자로 변경하는 프로그램을 작성한다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#define SIZE 100
 
int main(void)
{
    FILE *fp=NULL;
    char a[SIZE];
    int i;
    if((fp=fopen("1.txt","r+"))==NULL)
    {
        printf("잘못된 파일 열기\n");
        exit(1);
    }
    fgets(a,SIZE,fp);
    printf("입력 파일 : ");
    for(i=0;a[i]!=NULL;i++)
    {
        printf("%c ", a[i]);
    }
    printf("\n");
    fseek(fp,0,SEEK_SET);
    for(i=0;a[i]!=NULL;i++)
    {
        a[i]=toupper(a[i]);
    }
    fputs(a,fp);
    fseek(fp,0,SEEK_SET);
    fgets(a,SIZE,fp);
    printf("출력 파일 : ");
    for(i=0;a[i]!=NULL;i++)
    {
        printf("%c ", a[i]);
    }
    printf("\n");
    return 0;
}
cs




반응형

'컴퓨터 & 프로그래밍 & 전자공학 > C언어' 카테고리의 다른 글

fgets 함수  (0) 2017.02.11
파일 복사  (0) 2017.01.31
텍스트 파일 비교  (0) 2017.01.31
암호화와 복호화  (0) 2017.01.16
대소문자 변경  (0) 2017.01.16

+ Recent posts