01. 텍스트 파일 proverbs.txt를 읽어서 각 줄의 앞에 줄 번호를 붙여서 화면에 출력하는 프로그램을 작성하라.

#include <stdio.h>
    
int main() {
	FILE* fp = NULL;
	int count = 0;
	char buffer[100];
	
	fp = fopen("proverbs.txt", "r");
	if (fp == NULL) {
		fprintf(stderr, "파일을 열 수 없습니다.");
		return 1;
	}

	while (fgets(buffer,100,fp)) {
		count++;
		printf("%d: %s", count, buffer);
	}
    fclose(fp);
}

02. 텍스트 파일을 열어서 파일 안에 들어 있는 문자들을 모두 대문자로 변경하여 새로운 파일에 저장하는 프로그램을 작성한다. 새로운 파일을 화면에출력해서 확인하자.

#define  _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <ctype.h>

int main() {
    char f1[100];
    char f2[100];
    char buffer[100];
    int len;
    printf("첫 번째 파일 이름: ");
    scanf("%s", f1);
    printf("두 번째 파일 이름: ");
    scanf("%s", f2);

    FILE* fp1 = fopen(f1, "r");
    FILE* fp2 = fopen(f2, "w");

    if (fp1 == NULL || fp2 == NULL) {
        fprintf(stderr, "파일을 열 수 없습니다.");
    }

    while (fgets(buffer, 100, fp1)) {

        len = sizeof(buffer);
        for (int i = 0; i < len; i++) {
            buffer[i] = toupper(buffer[i]);
        }
        fputs(buffer, fp2);
        printf("%s", buffer);
    }
    fclose(fp1);
    fclose(fp2);
}

/* fgets()의 반환값을 읽은 바이트 수가 아니기 때문에 이 방법은 불가능

    while (len = fgets(buffer, 100, fp1)) {
        for (int i = 0; i < len; i++) {
            buffer[i] = toupper(buffer[i]);
        }
    }
*/

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

#include <stdio.h>
#include <ctype.h>
#include <string.h>

int main() {
    char f1[100];
    char f2[100];
    char buffer1[100], buffer2[100];
    int len;
    int same = 1;
    printf("첫 번째 파일 이름: ");
    scanf("%s", f1);
    printf("두 번째 파일 이름: ");
    scanf("%s", f2);

    FILE* fp1 = fopen(f1, "r");
    FILE* fp2 = fopen(f2, "r");

    if (fp1 == NULL || fp2 == NULL) {
        fprintf(stderr, "파일을 열 수 없습니다.");
    }

    while (fgets(buffer1, 100, fp1) && fgets(buffer2, 100, fp2)) {
        if (strcmp(buffer1, buffer2) != 0) {
            same = 0;
            break;
        }
    }
    if (same == 1) {
        printf("파일은 서로 일치함 \n");
    }
    else {
        printf("<< %s", buffer1);
        printf(">> %s", buffer2);
    }

    fclose(fp1);
    fclose(fp2);
}

04. 다음과 같이 학생들의 교과목 성적이 저장되어 있는 텍스트 파일을 읽어서 성적의 평균을 구하여 다른 파일에 쓰는프로그램을 작성해보자.  평균은소수점 2자리 까지 출력하도록 하라.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <ctype.h>
#include <string.h>

struct student {
	char name[100];
	int kor;
	int math;
	int eng;
};

int main() {
	FILE* f1, * f2;
	struct student temp;
	int sum = 0;

	f1 = fopen("input.txt", "r");
	f2 = fopen("output.txt", "w");

	if (f1 == NULL || f2 == NULL) {
		fprintf(stderr, "에라이");
		return 1;
	}

	while (!feof(f1)) {
		fscanf(f1, "%s %d %d %d", temp.name, &temp.kor, &temp.math, &temp.eng);
		sum = temp.kor + temp.math + temp.eng;
		fprintf(f2, "%s %.2f\n", temp.name, (double)sum / 3);
	}
    fclose(f1);
    fclose(f2);
}

 


05.  사용자로부터 받은 파일 이름으로 텍스트 파일을 연 후에 파일 안에 들어 있는 문자들의 개수와 단어들의 개수를 계산하여 출력해보자.

#include <stdio.h>
#include <ctype.h>

int main() {
	char file_name[100];
	FILE* fp;
	int c;
	int c_count = 0, w_count = 0;
	int word = 0;

	printf("파일 이름: ");
	scanf("%s", file_name);

	fp = fopen(file_name, "r");
	if (fp == NULL) {
		fprintf(stderr, "%s 파일을 열 수 없습니다. \n", file_name);
	}

	while ((c = getc(fp)) != EOF) {
		if (isprint(c)) {
			c_count++;
		}

		if (isspace(c)) {
			word = 0;
		}
		else if (word == 0) {
			word = 1;
			w_count++;
		}
	}
	fclose(fp);

	printf("문자의 개수는 %d \n", c_count);
	printf("단어의 개수는 %d \n", w_count);

}

06. 사용자가 입력하는 텍스트를 파일에 저장하여 주는 프로그램을 작성하여보자. 사용자가 Ctrl-Z를 입력하면 종료하는것으로 가정한다.

#include <stdio.h>

int main() {  
	FILE* fp = fopen("test.c", "w");
	int c;
	while ((c = getchar())!= EOF) {
		fputc(c, fp);
	}

	fclose(fp);
}
#include <stdio.h>

int main() {
	FILE* fp;
	char file_name[100];
	char buffer[100];

	printf("파일 이름: ");
	gets_s(file_name, sizeof(file_name)); // scanf() x

	fp = fopen(file_name, "w");
	if (fp == NULL) {
		fprintf(stderr, "%s파일을 열수 없습니다.", file_name);
		return 1;
	}

	while (fgets(buffer, sizeof(buffer), stdin) != NULL) {
		fputs(buffer, fp);
	}
	fclose(fp);
}

07.  명령 프롬프트에서 인수로 주어진 2개의 텍스트 파일을 합하여 하나의 파일로 저장하는 프로그램을 작성해보자.

#include <stdio.h>

int main(int argc, char *argv[]) {
	FILE* fp1, * fp2, * fp3;
	char buffer[1024];

	if (argc != 4) {
		fprintf(stderr, "사용법: %s <파일1> <파일2> <결과파일> \n", argv[0]);
        return 1;
	}

	fp1 = fopen(argv[1], "r");
	if (fp1 == NULL) {
		fprintf(stderr, "파일 %s를 열 수 없습니다. \n", argv[1]);
		return 1;
	}

	fp2 = fopen(argv[2], "r");
	if (fp2 == NULL) {
		fprintf(stderr, "파일 %s를 열 수 없습니다. \n", argv[2]);
		fclose(fp1);
		return 1;
	}

	fp3 = fopen(argv[3], "w");
	if (fp3 == NULL) {
		fprintf(stderr, "파일 %s를 열 수 없습니다. \n", argv[3]);
		fclose(fp1);
		fclose(fp2);
		return 1;
	}

	while (fgets(buffer, sizeof(buffer), fp1)) {
		fputs(buffer, fp3);
	}
	while (fgets(buffer, sizeof(buffer), fp2)) {
		fputs(buffer, fp3);
	}

	fclose(fp1);
	fclose(fp2);
	fclose(fp3);
	printf("C> fileadd %s %s %s \n", argv[1], argv[2], argv[3]);
	printf("%s 파일과 %s 파일을 합하여 %s 파일로 저장합니다.\n", argv[1], argv[2], argv[3]);

}

08. 텍스트 파일 proverbs.txt를 읽어서 사용자가 지정하는 줄을 삭제하는 프로그램을 작성해보자.  

#include <stdio.h>

int main() {
	FILE* fp1 = fopen("proverbs.txt", "r");
	FILE* fp2 = fopen("test.txt", "w");
	char buffer[100];
	int del;
	int cur_line = 0;

	if (fp1 == NULL || fp2 == NULL) {
		printf("파일을 열 수 없습니다. \n");
		return 1;
	}
	printf("삭제룰 원하는 줄 번호: ");
	scanf("%d", &del);

	while (fgets(buffer, sizeof(buffer), fp1)) {
		cur_line++;
		if (del == cur_line) {
			continue;
		}
		fputs(buffer, fp2);
	}
	printf("test.txt로 저장되었습니다. \n");
	fclose(fp1);
	fclose(fp2);
	

}

09. 텍스트 파일에서 특정한 단어를 찾아서 다른단어로 변경하여 출력 파일에 쓰는 프로그램을 작성해보자.

 

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

int main() {
	FILE* fp1 = fopen("test.txt", "r");
	FILE* fp2 = fopen("result.txt", "w");
	char buffer[100];
	char* pos;
	char old_word[] = "Android";
	char new_word[] = "안드로이드";

	if (fp1 == NULL || fp2 == NULL) {
		fprintf(stderr, "파일을 열 수 없습니다. \n");
		return 1;
	}

	while (fgets(buffer, sizeof(buffer), fp1) != NULL) {
		while ((pos = strstr(buffer, old_word)) != NULL) {
			*pos = '\0';
			fprintf(fp2, "%s%s", buffer, new_word);
			strcpy(buffer, pos + strlen(old_word));
		}

		fputs(buffer, fp2);
	}

	fclose(fp1);
	fclose(fp2);
}

10. 사용자가 지정하는 텍스트 파일을 읽어서 시저 암호 방법으로 암호화된 파일을 생성하는 프로그램을 작성해보자.

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

int main() {
	FILE* fp1, * fp2;
	char name[100];
	int key, c;

	printf("파일 이름을 입력하시오: ");
	scanf("%s", name);

	fp1 = fopen(name, "r");
	fp2 = fopen("test_enc.txt", "w");
	if (fp1 == NULL || fp2 == NULL) {
		fprintf(stderr, "파일을 열 수 없습니다. \n");
		return 1;
	}

	printf("이동 거리를 입력하시오: ");
	scanf("%d", &key);

	while ((c = fgetc(fp1)) != EOF) {
		if (c >= 'A' && c <= 'Z') {
			c += key;
			if (c > 'Z'){
				c -= 26;
			}
		}
		else if (c >= 'a' && c <= 'z') {
			c += key;
			if (c > 'z') {
				c -= 26;
			}
		}
		fputc(c, fp2);
	}
	printf("암호화된 파일은 %s입니다.", "test_enc.txt");
	fclose(fp1);
	fclose(fp2);
}

11. 하드 디스크에서 파일을 삭제하는 프로그램을 작성해보자.

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

int main() {
	char name[100];
	
	printf("파일 이름을 입력하시오: ");
	scanf("%s", name);

	if (remove(name) == 0) {
		printf("%s가 성공적으로 삭제되었습니다. \n", name);
	}
	else { // remove(name) == -1 
		printf("%s가 삭제되지 않았습니다. \n", name);
	}
}

12.

(1) 사람들의 이름과 전화번호를파일에 저장하는 프로그램을 작성해보자. 사람들의 이름은 aa부터 zz까지 676(26X26)개의 이름을 자동으로 생성한다. 전화번호도 100부터 775까지를 자동으로 생성한다.

#include <stdio.h>

int main() {
	FILE* fp;
	int start = 100;

	fp = fopen("phone.txt", "w");
	if (fp == NULL) {
		fprintf(stderr, "phone.txt 파일을 열 수 없습니다. \n");
		return 1;
	}

	for (int i = 'a'; i <= 'z'; i++) {
		for (int j = 'a'; j <= 'z'; j++) {
			fprintf(fp, "%c%c %d\n", i, j, start );
			start++;

		}
	}
	fclose(fp);

}

 

(2) 위에서 생성된 전화번호부 파일 phone.txt를 읽고, 여기에서 사용자가 지정하는 사람의 전화번호를 찾아서 화면에 표시하고 종료하는 프로그램을 작성해보자.

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

int main() {
	FILE* fp;
	char find_name[3], name[3];
	int tel;
	
	fp = fopen("phone.txt", "r");
	if (fp == NULL) {
		fprintf(stderr, "phone.txt 파일을 열 수 없습니다. \n");
		return 1;
	}

	printf("찾고자 하는 사람의 이름: ");
	scanf("%s", find_name);

	
	// fscanf()의 반환 값은 읽은 값의 개수이다.
	while (fscanf(fp,"%s %d", name, &tel)== 2) {
		if (strcmp(find_name, name) == 0) {
			printf("%s의 전화번호는 %d입니다. \n", find_name, tel);
			break;
		}
	}

	fclose(fp);

}

13. 자기가 소유하고 있는도서를 관리하는 프로그램을 작성하여보자. 다음과 같으 메뉴 화면을 가진다.  

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>


struct book {
	char name[100];
	char writer[100];
	char publisher[100];
};

void print();
void add(FILE* fp);
void search(FILE* fp);
//void save(FILE* fp);
//void read(FILE* fp);

int main() {
	FILE* fp;
	struct book list;
	int menu;

	fp = fopen("library.txt", "a+");
	if (fp == NULL) {
		fprintf(stderr, "파일을 열 수 없습니다. \n");
		return 1;
	}

	while (1) {
		print();
		printf("정수값을 입력하시오: ");
		scanf("%d", &menu);
		getchar();

		switch (menu) {
		case 1:
			add(fp);
			break;
		case 2:
			search(fp);
			break;
		//case 3:
		//	save(fp);
		//	break;
		//case 4:
		//	read(fp);
		//	break;
		case 5:
			fclose(fp);
			return 0;
		default:
			printf("잘못된 입력입니다. \n");
		}
	}


}

void print() {
	printf("======================\n");
	printf(" 1. 추가 \n");
	printf(" 2. 검색 \n");
	printf(" 3. 파일로 저장 \n");
	printf(" 4. 파일에서 일기 \n");
	printf(" 5. 종료 \n");
	printf("======================\n");
}

void add(FILE* fp) {
	struct book temp;
	printf("도서의 이름: ");
	gets_s(temp.name, sizeof(temp.name));
	printf("저자: ");
	gets_s(temp.name, sizeof(temp.name));
	printf("출판사: ");
	gets_s(temp.name, sizeof(temp.name));

	fseek(fp, 0, SEEK_END);
	fprintf(fp, "%s %s %s\n", temp.name, temp.writer, temp.publisher);
}

void search(FILE* fp) {
	struct book temp;
	char find[100], line[100];

	printf("찾는 책의 이름을 입력하시오: ");
	gets_s(find, sizeof(find));

	fseek(fp, 0, SEEK_SET);

	while (fgets(line,sizeof(line),fp)) {
		sscanf(line, "%[^|]%[^|]%[^|]", temp.name, temp.writer, temp.publisher);
		if (strcmp(find, temp.name) == 0) {
			printf("도서의 이름: %s \n", temp.name);
			printf("저자: %s \n", temp.writer);
			printf("출판사: %s \n", temp.name);
			break;
		}
	}
	printf("찾으시는 책이 없습니다. \n");
}

답이 없다.. ;ㅁ;


14. 이진 파일의 가장 전형적인 예는이미지 파일이다. 이미지 파일 안에는 이미지 픽셀 값들이 이진값으로 저장된다. 많은 이미지 파일은 앞에 헤더가 있어서 헤더를 해석해야만이 이미지 픽셀값들을꺼내서 사용할수 있다. 다행하게도 RAW 파일 형식은 이미지 헤더가 없고 픽셀값이 8비트 이진데이터로 저장되어 있다. "lena(256x256).raw" 파일을읽어서 화면에 표시하는 프로그램을 작성해보자. "lena(256x256).raw"파일은 출판사 홈페이지나 인터넷에서 구할 수 있다.        

 

+ Recent posts