ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 파일입출력, 구조체를 이용한 성적계산(2017최신버전)
    c언어 기초 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); //출력된 파일 닫음

    }



    '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

    댓글

Designed by Tistory.