c언어 fread 질문

c언어 fread 질문

작성일 2017.07.19댓글 1건
    게시물 수정 , 삭제는 로그인 필요

fread를 이용해 문자열을 입력받아서 출력하려고 하는데 자꾸 이상하게 나옵니다.

#include<stdio.h>

int main()
{
 FILE * ms;
 fopen_s(&ms, "C://test//mystory.txt", "rt");
 char str[20];
 int en;

 if(ms==NULL)
 {
  puts("파일 오픈 실패!");
  return -1;
 }

 while (1)
 {
  en = fread((void*)str, 1, sizeof(str), ms);
  if (en < sizeof(str))
  {
   if (feof(ms) != 0)
   {
   fread((void*)str, 1, en, ms);
   printf("%s", str);
    puts("전부출력!");
    break;
   }
   else
   {
    puts("실패!");
    break;
   }
  }
  printf("%s", str);
 }
 fclose(ms);
 return 0;


위와 같이 하니



이렇게 나왔는데 중간에 한자같은게 안나오게 하려면 어떻게 해야하나요?


왜 한자같은게 나오는지 이유는 재생각에는

한글은 1byte로 나타낼수 없어서 str을 20 중에 18까지 사용이 되었는데 1byte가 남은 상황에서(마지막은 NULL이므로) 다음에 한글이 올 경우에 저렇게 나오는 걸로 알고있습니다.

그래서 제가 fread((void*)str, 2, sizeof(str), ms)로 바꾸니 아에 완전히 실행되지 않고 while문이 한번 반복되고 2번째로 fread문을 만날 때에 오류가 생겨 팅기더군요.




1. fread문에서 fread(1번칸,2번칸,3번칸,4번칸) 2번칸에는 무조건 1만 적어야 하나요? 다른숫자를 적어도 된다면 적어도 되는 경우좀 알려주세요 ㅜㅜ


2. 만약 fread문을 사용하여 위의 내용을 나타낼 수 있다면 어떻게 해야 하나요?

(fgets를 사용해서 하는 법은 알고있지만 fread문을 써서 해보고싶네요)





#c언어 fread #c언어 fread fwrite #c언어 fread 파일 읽기 #c언어 fopen fread

profile_image 익명 작성일 -

알고 계신게 맞습니다.
멀티바이트 문자 환경에서 부득이하게 작은 크기의 버퍼를 사용해야 할 때 접할 수 있는 문제입니다.
0부터 9까지의 숫자와 일부 특수 문자, 그리고 알파벳 등은 1바이트만을 써서 공간을 절약하고
1바이트로 표현할 수 없는 다른 문자들에 대해서는 2바이트를 사용하는 방식을 말하는데,
2바이트 문자를 읽어들어야 할 때 버퍼가 가득 차서 끊어야 하는 경우 꼬이는 거죠.

1. 이 경우는 그냥 문자를 와이드 캐릭터로 사용하시는 게 정신 건강 상 이롭습니다.
ASCII 문자가 나오는 일이 별로 없다면 어차피 한 문자는 2바이트일 가능성이 높으니
그냥 기록하는 과정에서부터 모든 문자를 2바이트로 취급하겠다는 말이죠.

MSVS에서의 wchar_t는 2바이트입니다. fread의 두번째 인자, 세번째 인자도 변해야 합니다.
fread를 빼고 이전 소스와 달라진 점이라면 char 타입 대신 wchar_t를 쓴다는 점,
printf 대신 wprintf가 사용되었고 "%s" 대신 L"%ls"를 사용한다는 점,
wprintf가 올바르게 동작하도록 Windows 한정으로
_wsetlocale(LC_ALL, L"Korean")을 추가로 호출했다는 점이 있겠군요.
데이터를 읽어올 텍스트 파일은 Windows 메모장 기준 '유니코드' 방식으로 저장되어야 합니다.

2. 아니면 버퍼 크기를 많이 늘려주시면 됩니다. 

c언어 fread fwrite질문

fread와 fwrite로 파일을 그대로 넘겨주려고 아래와 같은 코드를 짰습니다. fread(read_buf, sizeof(char), BUF... 안의 내용을 확인해보니 기존 fread를 한 파일...

c언어 fread 질문

fread를 이용해 문자열을 입력받아서 출력하려고... return -1; } while (1) { en = fread((void*)str, 1, sizeof(str), ms); if (en < sizeof(str)) { if (feof(ms) != 0) { fread((void...

c언어 fread 질문이요

fread(주소,항목의 크기,항목의 갯수,파일)... 이 문제는 꼭 fread 만 해당 되는 부분은 아닙니다. 다음을... 그래서 fread( &idx, ....) 라고 표현 하고 fread( data, ... ) 으로 사용...

c언어 fread

c언어 에서 fread를 구조체와 함께 사용할때 흔히 fread(struct 이름... '유사한' 경우를 말로 설명해서 질문하면 받을 수 있는 건 '유사한...

unix, c언어 fread 질문이요

... if (fread(output, 1, buff, input) != buff) { printf("FAILED TO COPY."); exit(0)... if (fread(buf, 1, size, input) != size) { exit(EXIT_FAILURE); } if (fwrite(buf...

C언어 fread fwrite 질문입니다

... fread(&s2,sizeof(s1),sizeof(s1)/sizeof(s1[0]),fp) 이러고 printf 로 s2를 출력하면 s1과 같아야하는거아닐까요?? 출력 결과가 이상하게 나와서 질문드립니당...

C언어 fgets fread 질문입니다

... fread를 보니까 버퍼를 선언하고 반드시 0으로 초기화를 반드시 해야하더라구요... fread는 기본적으로 byte 단위, 즉 Binary 기반 처리 함수입니다. 문자열이고, 아니고...

c언어 fread함수 질문입니다.

... fread(&a,sizeof(int),1,fp); printf("%d",a); fclose(fp); getch... 그런데 제가 아무리 fread로 a라는변수에... 그래서 fread 하시면 문자코드들이 읽혀져서 자리도...

c언어 fread함수 count질문드립니다.

... 안돼서 질문드립니다. ......... int buf[12]; fread((void*)buf, sizeof(int), 12, fp); ....... fp에 int형 이 10개 들어있으면 끝에 도달해서 count보다 작은 값이...

c언어 fread,fwrite 사용예제 질문

... return -1; } while(1) { readCnt=fread((void*)buf,1,sizeof(int),src); // 1,2번질문 if(readCnt<sizeof(buf)) { if(feof(src)!=0) { fwrite((void*)buf,1,readCnt,des); puts("파일복사 완료...