파일 입출력 코드 설명 부탁드립니다.(fread, fwrite)

파일 입출력을 처음 공부중입니다만,

리눅스에서 쓸때에는 실행명령어에 파일 이름도 추가해야 하더라고요

그래서 main의 argv, argc를 활용하는건 알겠는데

이 코드가 순차적으로 어떤일을 하는지 이해가 잘 안갑니다

이해가 가면 활용을 할 수 있을 것 같은데

도와주신다면 감사하겠습니다.

예제의 student.h는 아마도 구조체가 선언되어있는곳 같습니다.

fread 예제

#include <stdio.h>
#include "student.h"

int main(int argc, char **argv)
{
    struct student record;
    FILE *fp;
    
    if (argc !=2)
    {
        fprintf(stderr,"Usage: %s filename\n", argv[0]);
        return 1;
    }
    
    if ( (fp = fopen(argv[1], "rb")) == NULL)
    {
        fprintf(stderr, "Error: Cannot open the file %s\n", argv[1]);
        return 2;
    }
    

    printf("-------------------------------------\n");
    printf("%s\t %7s\t %6s\n", "Sno", "Sname", "Sgrade");
    printf("-------------------------------------\n");
    
    while (fread(&record, sizeof(record), 1, fp) > 0)
    {
        if (record.id !=0)
        printf("%d\t %s\t %lf\n", record.id, record.name, record.score);
    }

    printf("\n");
    printf("-------------------------------------\n");
    return 0;
}

fwrite 예제

#include <stdio.h>
#include <stdlib.h>
#include "student.h"

int main(int argc, char **argv)
{
    struct student record;
    FILE *fp;
    
    if (argc !=2) {
        fprintf(stderr,"Usage: %s filename\n", argv[0]);
        exit(EXIT_FAILURE);
    }

    fp = fopen(argv[1], "wb");
    printf("%s %7s %6s\n", "Sno", "Sname", "Sgrade");
    while (scanf("%d %s %lf", &record.id, record.name, &record.score) == 3) {
        fwrite(&record, sizeof(record), 1, fp);
    }
    fclose(fp);
    return 0;
}

안녕하세요.

어떤부분의 어떤 설명을 원하신다는건지… ^^
파일 입출력관련된 로직을 모르시겠다는건가요?

fread 예제로 만든 파일이 test.exe거나 test 일때.

콘솔창에서 test.exe text.txt 나 test text.txt 로 실행시키면.

argc = 2

argv[0] = “test.exe” or “test”

argv[1] = “text.txt” 입니다.

다 떠멕여드릴 사람이 아무도 안계신거 같으니

모르는게 이것일꺼라 생각하고 찍어서 글을 써 봤습니다.

1 Like

도와주셔서 감사합니다 ㅠㅠ

가 왜 있는지 잘 모르겠습니다.
그리고 왜 굳이 fprintf를 쓰는건지…
마지막으로 fread의 처음과 끝의 매개변수가 뭔지 잘 모르겠습니다.

출력에 stdout과 stderr이 있습니다. printf를 쓰게 되면 stdout으로 출력하지만, fprintf를 쓰게 되면 출력 스트림을 지정해줄 수 있습니다.

이 문구는 입력 변수의 갯수를 검증하여 올바른 옵션을 입력했는지 검사하는것이죠.

예를 들어 unix계열 시스템의 cp명령어를 보면
cp a b 라고 하면 a라는 파일을 b로 복사하는것이죠? 즉 2개의 옵션이 입력되어있는지 검사하는거죠. cp a 라고 입력하면 “인자가 부족하다” 이런식으로 정보를 출력해서 사용자가 올바른 입력을 할 수 있게 말이죠.

즉 읽을 파일의 이름을 입력했는지 검사하는 과정입니다. fprintf를 사용한것은 stderr 스트림으로 출력하기 위해서에요. printf로 하면 stdout스트림으로 출력이 되잖아요. 에러 메세지는 stderr 스트림으로 출력하는겁니다.

잘 이해하시려면 아마 unix 호환 시스템들의 구조에 익숙해지셔야 할 것 같네요.

1 Like

감사합니다 ㅠㅠ

와… 진짜 감사합니다. 생각이 안났어요 ㅠㅠ