-
파일입출력, 구조체를 이용한 성적계산(2017최신버전)c언어 기초 2017. 7. 28. 18:32
//입력한 3개의 데이터의 합을 파일에 출력
//상위버전인 경우 _s 붙이는 것에 유의!!!!
//fscanf_s(fp1, "%s", s[i].name,20); 문자열 스캔시 가장 마지막 인수에 byte 적어야함
#if 0
#include<stdio.h>
void main() {
int num, i, sum = 0;
FILE *fp;
fopen_s(&fp, "sum.txt", "w");
//경로를 적지 않으면 작업중인 폴더에 저장
for (i = 0; i < 3; i++) {
printf("숫자 총 3개중 %d번째 숫자 입력 : ", i + 1);
scanf_s("%d", &num);
sum += num;
}
printf("숫자 3개의 총 합 : %d\n", sum);//화면출력
fprintf(fp, "숫자 3개의 총 합 : %d\n", sum);
fclose(fp);
}
#endif
#if 0
//파일을 읽어와서 그 내용을 복사하여 새로운 파일에 생성
#include<stdio.h>
#include<stdlib.h>
void main() {
char read[2000];
FILE *rfp, *wfp;
fopen_s(&rfp, "sum.txt", "r");
fopen_s(&wfp, "sum-copy.txt", "w");
if (rfp == NULL) {
printf("파일이 없어서 작업 불가능!!!");
exit(1);
}
for (;;) {
fgets(read, sizeof(read), rfp);
if (feof(rfp))
break;//파일의 내용이 끝이면 더이상 읽지 않음
fputs(read, wfp);
}
fclose(rfp);
fclose(wfp);
}
#endif
#if 0
#include<stdio.h>
#include <stdlib.h> //for exit(1)
#include <string.h>
int main(void)
{
FILE *fp;
char fname[20], buffer[300], word[20];
int line_num = 0;
printf("파일 이름을 입력하세요 :");// d:\\test\\baby.txt
scanf_s("%s", fname,20);
printf("검색할 단어는 ? : ");
scanf_s("%s", word,20);
fopen_s(&fp,fname, "r");
if (fp == NULL) {
fprintf(stderr, "파일%s를 열 수 없어요 \n", fname);
exit(1);
}
while (fgets(buffer, 300, fp)) {
line_num++;
if (strstr(buffer, word))//문자열 찾아주는 함수
printf("%s:%d 단어 %s이 발견!\n", fname, line_num, word);
else
printf("%s:%d 단어를 찾을 수 없습니다 \n", fname, line_num);
}
fclose(fp);
puts("complete");
return 0;
}
#endif
#include <stdio.h>
#define OUTPUT "topten.txt" //등수별로 출력할 파일명 정의-경로표시가 없는 경우 현 솔루션파일과 같은 경로에 있음
void main()
{
struct student { //구조체 선언
char name[10];
float sub[3];
float total;
int rank;
} s[10];
int i, j;
char filename[20];
FILE *fp1, *fp2; //파일형 변수 선언
while (1) //무한루프
{
printf("입력할 파일명을 입력하세요(예: *.txt):"); //파일명을 입력받을 문구 출력
scanf_s("%s", filename,20); //입력받은 문자열을 filename에 저장
//->현 솔루션파일과 같은 경로에 없는 경우 경로 표시. 예)d:\\source.txt
fopen_s(&fp1, filename, "r"); //파일명이 저장된 파일을 읽기전용으로 연다
if (fp1 == NULL) //열린 파일이 없으면
printf("해당 파일이 없습니다."); //에러문구 출력하고 다시 무한루프의 처음으로 반복
else //아니면
break; //무한반복 탈출
}
for (i = 0; i < 10; i++) { //i는 0부터 10보다 작은동안 1씩 증가하며 10번 반복
fscanf_s(fp1, "%s", s[i].name,20);
fscanf_s(fp1, "%f %f %f", &s[i].sub[0], &s[i].sub[1], &s[i].sub[2]);
}
fclose(fp1); //파일을 각각의 변수에 저장 하고 파일을 닫는다
for (i = 0; i<10; i++) //i는 0부터 10보다 작은동안 1씩 증가하며 10번 반복
s[i].total = s[i].sub[0] + s[i].sub[1] + s[i].sub[2]; //각 과목의 총합을 더하여 total에 저장
for (i = 0; i<10; i++) //i는 0부터 10보다 작은 동안 1씩 증가하며 10번 반복
{
s[i].rank = 1; //rank에 초기값 1을 저장
for (j = 0; j<10; j++) //j는 0부터 10보다 작은동안 1씩 증가하며 10번 반복
{
if (s[i].total < s[j].total) //s[j].total 값이 s[i].total 보다 크면
s[i].rank++; //s[i].rank +1을 한다
}
}
printf("┌──────【 입력된 성적표 】──────┐\n");
printf("│ 이름 국어 수학 C언어 │\n");
for (j = 0; j<10; j++) //j는 0부터 10보다 작은동안 1씩 증가하며 10번 반복
printf("│%10s%10.1f%10.1f%10.1f │\n", s[j].name, s[j].sub[0], s[j].sub[1], s[j].sub[2]);
printf("└─────────────────────┘\n\n");
fopen_s(&fp2,OUTPUT, "w"); //파일을 쓰기전용으로 연다
printf("┌───────────【 순위별 성적표 】───────────┐\n");
fprintf(fp2, "┌───────────【 순위별 성적표 】───────────┐\n");
printf("│ 이 름 국어 수학 C언어 합계 등수 │\n");
fprintf(fp2, "│ 이 름 국어 수학 C언어 합계 등수 │\n");
//성적표 항목 을 콘솔(화면)및 파일에 출력
for (i = 1; i <= 10; i++) //i는 1부터 10보다 작거나 같은동안 1씩 증가하며 10번 반복
{
for (j = 0; j<10; j++) //j는 0부터 10보다 작은동안 1씩 증가하며 반복
{
if (s[j].rank == i) //각각의 등수가 i과 같으면 (즉, 1등부터 차례로 출력)
{
printf("├───────────────────────────────┤\n");
fprintf(fp2, "├───────────────────────────────┤\n");
printf("│%10s%10.1f%10.1f%10.1f%10.1f%10d │\n", s[j].name, s[j].sub[0], s[j].sub[1], s[j].sub[2], s[j].total, s[j].rank);
fprintf(fp2, "│%10s%10.1f%10.1f%10.1f%10.1f%10d │\n", s[j].name, s[j].sub[0], s[j].sub[1], s[j].sub[2], s[j].total, s[j].rank);
} //해당 사람의 성적을 콘솔및 파일에 출력
}
}
printf("└───────────────────────────────┘\n");
fprintf(fp2, "└───────────────────────────────┘\n");
fclose(fp2); //출력된 파일 닫음
}
'c언어 기초 ' 카테고리의 다른 글
win32 가없을때 (0) 2017.09.09 영화 마션 ASCII CODE 재현 (0) 2017.06.10 C언어 문자열 정렬 (1) 2017.05.23 참고하면 좋은 배열 관련 PDF 파일 (0) 2017.04.30 & 연산자 (0) 2017.04.24