c언어 텍스트파일 탭으로 공백처리한 부분을 불러올때 질문

조회수 1176회
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct {
    char name[20];
    int year;
} movie;

int main(void)
{
    movie hitMovie[20];
    int i;
    FILE* fp;

    fp = fopen("movie1.txt", "r");
    fread(&hitMovie, sizeof(hitMovie), 1, fp);

    for (i = 0; i < 1; i++) {
        printf("%s %d\n", hitMovie[i].name, hitMovie[i].year);
    }
    fclose(fp);
    return 0;
}

이렇게 코딩을 하게되면 파일안에 있는 내용이 제대로 불러오지만 마지막내용뒤부터 쓰레기값들이 출력이 되고있습니다. 해결방법이 궁금합니다 . 파일의 내용 중 공백은 탭으로 작성되어있습니다! 예 ) 명량 2014 이미지

  • movie 구조체가 메모리에 할당될 때 몇바이트일까요? 문제는 단순한겁니다. 질문자는 내 파일에는 100개의 문자가 있고 100개짜리 문자 20개를 출력할 것이니 100 * 20 하면 되겠지...해서 작업한겁니다. sizeof 로 크기를 보고 파일 크기랑 비교해보세요. 그 다음 할당 받은 메모리 사이즈가 더 크다면 앞부터 파일문자로 채우고 나머지는 무슨 글자가 있을까요? 정영훈 2020.4.13 17:11
  • 그러면 sizeof크기를 너무 크게설정했다는 말씀인가요? sizeof(hitmovie)로 해서나온값이 720입니다. 알 수 없는 사용자 2020.4.13 17:31
  • 텍스트파일은 크기가 몇인가요? 크기가 다를겁니다. 고민해보시구요...힌트를 드리자면 우선 반복하며서 구조체 한개씩 출력하는 형태로 작성해보세요. 정영훈 2020.4.13 17:47
  • 텍스트파일의 크기는 585입니다. 그러면 fread를 사용하지말고 fgets를 사용해야하는 것인가요? 알 수 없는 사용자 2020.4.13 17:58
  • 왜..를 고민해보세요. 텍스트파일은 585바이트인데 메모리는 720바이트를 할당했습니다. 585바이트외의 나머지는 쓰레기 데이터가 있는 것이고 그것이 출력되는 겁니다. 원인을 알았으니 한번 고민해보세요. 메모리할당을 sizeof 하지 말고 585라고 강제로 주고 해보세요. 문제가 없다면 585 정확히 할당할 수 있는 방법은 없는건가...를 고민해보고요. 이런건 누가 답을 하면 님은 남는 것이 없는 겁니다. 정영훈 2020.4.13 19:12
  • 구조체를 초기화를 먼저 해줌으로서 문자열 쓰레기값은 출력이 되고있지않습니다. 하지만 숫자 쓰레기값이 존재하는데 이럴땐 크기문제가 돌아오는 것인가요? 알 수 없는 사용자 2020.4.13 20:31
  • 강교수님과제네요ㅎㅎ 알 수 없는 사용자 2020.4.17 01:33

1 답변

  • 영화명<탭>년도숫자문자<줄바꿈>
    영화명<탭>년도숫자문자<줄바꿈>
    영화명<탭>년도숫자문자<줄바꿈>
    ...
    

    형식의 텍스트파일을 읽어서, 정의한 movie 구조체에 집어넣을 수 없죠.

    한줄씩 읽어서, 탭문자 전까지를 movie.name 에 복사해 넣어주고, 나머지 숫자형식의 문자열atoi 등으로 int 로 변환해 준 다음에 movie.year 에 넣어줘야 하겠죠.

    입력파일의 형식이 텍스트파일이기 때문에, fread 호출 한번으로 자동으로 movie 구조체가 채워지는 방법은 없습니다.

    굳럭.

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)