c언어 기초

파일입출력, 구조체를 이용한 성적계산(2017최신버전)

달달고냥 2017. 7. 28. 18:32

topten.txt



//입력한 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); //출력된 파일 닫음

}