2016-05-31 2 views
0

세미콜론 읽기 방지 방법; FILE에 저장하고 변수에 저장 하시겠습니까? 무시하는 방법 ';' 파일에서 fscanf?

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 
int main(void) 
{ 
char gstitem[6], gstname[30],; 
int gstquant, itemquant; 
float gstprice; 

char string[10]; 
printf("Purchase items fuction\n\n"); 
FILE *gstPtr; //pointer to the gst.txt 
gstPtr = fopen ("gst.txt", "r+"); 
printf("Enter an item code: "); 
fgets(string,10,stdin); 
(!feof(gstPtr)); 
{ 

    fscanf(gstPtr,"%[^;]s %[^;]s %[^;]f %[^;]d\n",gstitem,gstname,&gstprice,&gstquant); 
    printf("%s %s %f %s\n",gstitem,gstname,gstprice,gstquant); 
    } 
fclose(gstPtr); 
} 

내가 절을 형식 문자열

gst.txt

+0

이미지가 텍스트의 작은 양 : 질문의 일부로서 텍스트로 게시하시기 바랍니다. [Minimal, Complete, and Verifiable example] (http://stackoverflow.com/help/mcve) 아이디어는 독자가 코드와 입력 데이터를 복사하고 시도 할 수 있도록하기위한 것입니다. –

+1

'fscanf()'의 결과를 확인하지 않으면 [_Road to Perdition_] (http://www.dictionary.com/browse/perdition), – chux

+0

루프 이전에'fgets'의 목적은 무엇입니까? 루프 제어는 무엇입니까? (! feof (gstPtr)); [sic]가되어야하나요? [feof' (http://stackoverflow.com/questions/5431941/why-is-while-feof-file-always-wrong)의 사용에 대해 조심하는 것 외에도 루프를 제어하는 ​​방법은 반환과 함께합니다. 'fscanf (...) == 4) {...}' –

답변

3

문제를 fscanf 할 파일입니다 : 당신이 %[^;] 형식 지정자를 사용하는 경우

  1. , 당신은 안 s을 추가하십시오. 예상되는 데이터가 문자열임을 암시합니다.

  2. 너비를 지정하지 않고 %[^;]을 사용하면 변수가 보유 할 수있는 것보다 많은 데이터를 읽을 수 있습니다. 항상 읽을 수있는 최대 문자 수를 지정하십시오. %[^;]d%[^;]f

  3. 사용은 당신이 intfloat 읽을 수 없습니다.

  4. 형식 문자열에 \n을 사용하지 마십시오. 그러면 fscanf은 다음 비 공백 문자까지 모든 문자를 읽고 무시합니다. 개행 문자 만 읽지는 않습니다. 개행을 포함하여 개행을 포함하여 모든 것을 건너 뛰는 다른 행을 추가하는 것이 더 좋습니다.

사용 :

fscanf(gstPtr,"%5[^;];%29[^;];%f;%d",gstitem, gstname, &gstprice, &gstquant); 
int c; 
while ((c = fgetc(gstPtr)) != EOF && c != '\n'); 
+2

''% [^;] ''와 같은 무제한 폭 지정자는'gets()'와 거의 비슷합니다. – chux

+1

@chux, 참으로. 포인터 주셔서 감사. –