2013-07-09 6 views
0

C 프로그래밍 언어를 사용하고 있고 이진 파일의 모든 줄의 첫 번째 문자열을 읽으려고합니다. 바이너리 파일의 데이터C에서 이진 파일에서 읽는 데 실패했습니다

예는

Iliya Iliya Vaitzman을 (난 당신을 보여주기 위해 TXT 파일에 기록했다) 16.00 이스라엘 1 0 1

I가 읽고 싶어 줄의 첫 번째 Iliya (또는 줄의 첫 번째 단어가 될 것입니다).

나는 다음과 같은 코드를 시도하고 있지만, 내가 그에게

다음 코드 준 문자열 변수에 NULL 반환 계속 : 나는 부울 변수에 타입 정의와 #DEFINE를 사용

FILE* ptrMyFile; 
    char usernameRecieved[31]; 
    boolean isExist = FALSE; 
    ptrMyFile = fopen(USERS_CRED_FILENAME, "a+b"); 
    if (ptrMyFile) 
    { 
     while (!feof(ptrMyFile) && !isExist) 
     { 
      fread(usernameRecieved, 1, 1, ptrMyFile); 
      if (!strcmp(userName, usernameRecieved)) 
      { 
       isExist = TRUE; 
      } 
     } 
    } 
    else 
    { 
     printf("An error has encountered, Please try again\n"); 
    } 
    return isExist; 

(0입니다 거짓, 그 외 모든 것은 참 (TRUE는 참, 거짓은 FALSE)

usernameRecieved는 fread에서 NULL을 계속 유지합니다.

이 문제를 해결하려면 어떻게해야합니까? 대신이의

+0

fread()에서 1 바이트 만 읽는 중입니다. –

+0

바이너리 파일의 형식이 맞지 않습니까? '\ 0'이 종료되고 정확한 위치와 길이를 알지 않는 한,'freed()'로 바이너리 파일에서 C 문자열을 읽을 수 없습니다. 'userName'이 정의되지 않았습니다. –

+0

파일 읽기 논리가 잘못되었습니다. 'feof()'함수는 당신이 file_의 끝을 지나서 읽으려고 시도했을 때만 0이 아닌 값을 반환한다. 즉, 파일의 마지막 레코드를 성공적으로 읽은 후'feof()'는 false를 반환하고 다른 fread()를 수행하고 그 결과를 계속 사용함을 의미합니다. 'fread()'의 반환 값은 읽은 객체의 수이기 때문에 올바른 절차는'fread()'의 반환 값을 항상 테스트하는 것입니다. 만약 값이 0이거나 틀린다면 _then_ 당신은'feof()'를 체크하고 루프를 빠져 나가야 할지를 결정한다. ('ferror()'도 참조하십시오.) –

답변

0

:

fread(usernameRecieved, 1, 1, ptrMyFile); 

이 시도 : 그대로

memset(usernameRecieved, 0, sizeof(usernameRecieved)); 
fread(usernameRecieved, sizeof(usernameRecieved)-1, 1, ptrMyFile); 

, 당신은에서 대부분의 파일에서 하나의 바이트를 읽고있다.

+0

아직 파일을 수신합니까? [img] http://ufu.co.il/files/ox3rzk25hr6rqk51o5j2.jpg [/ img] –

+0

파일에 실제로 데이터가 포함되어 있고 파일이 있습니까? – Devolus

+0

감사합니다. –

0

Documentation on fread

몇 가지 : 당신은 오직 1 바이트를 읽을 수 있습니다, 그래서 당신은 기껏해야 1로 FREAD의 카운트 필드를 설정하는 (당신은 EOF 또는 다른 터미널 마커를 때리지 마세요 가정). 그것은 가능성이 높습니다 당신이 원하는 것은입니다 : 당신이 당신의 전체 문자 버퍼에 복사합니다

fread(usernameRecieved, 1, 31, ptrMyFile); 

그런 식으로. 그런 다음 사용중인 구분 기호 (공백, 마침표 등) 만 비교할 수 있습니다.

"usernameRecieved가 계속 NULL을 가져 오는 것"이 ​​무엇인지는 명확하지 않습니다. usernameRecieved가 스택에 있습니다 (malloc을 사용하고 있지 않습니다). 아무 것도 읽히지 않는다는 뜻입니까? 나는 당신이 항상 얼마나 많은 양을 읽었는지 fread의 반환 값을 검사 할 것을 제안한다; 이것은 디버깅에 유용합니다.

+0

아직도, 나는 같은 것을 받는다. http://ufu.co.il/files/ox3rzk25hr6rqk51o5j2.jpg –

+0

그건 null이 아니에요. 그건 'M'의 전체 묶음입니다. 입력 파일에 수많은 M이 있습니다/잘 형성되어 있습니다. ? – akroy

관련 문제