2014-10-07 8 views
-2

나는 C로 수업을 듣고 있으며 다음과 같은 과제에 직면 해있다. 1. XCode를로드하고 새로운 C 프로젝트를 시작한다. 원하는 경우 프로젝트에서 불필요한 코드 인 을 제거하여 프로젝트에서 주 기능을 실행하는 데 필요한 것만 가지고 으로 남겨 두십시오. 2. 사용자에게 두 개의 값을 입력하라는 메시지를 표시합니다. 첫 번째 문자는 이고 값은 'D'또는 'C'입니다. 두 번째 값은 금액을 나타내는 부동 소수점 포인트 값이어야합니다. , D 250 \ n C, 500 \ n 4. 테스트 프로그램을하고 를 생성하는 텍스트 파일을 검사 : 각 값으로 3. 다음과 같은 형식으로 저장하는 텍스트 파일에 기록에게 그것을 입력 그것이 필요한 형식으로되어 있는지 확인하십시오. 5. 시작 잔액을 $ 1,000.00으로 가정하고 이전에 작성한 텍스트 파일에서 각 항목을 더하거나 뺄 때 계정에 대한 완료 원장 및 최종 잔액을 으로 출력하는 두 번째 프로그램을 작성하십시오. 'C'로 표시된 항목 은 계정에 추가해야하고 'D'로 표시된 항목 은 출금 (공제)해야합니다.파일 읽기 및 인쇄

나는 이미 파일을 만들었고 5 단계로 넘어갔습니다. 파일에서 'c'또는 'd'인지를 확인하는 첫 번째 문자를 얻는 방법을 알고 있지만 이후에는 그렇지 않습니다. 같은 줄에서 숫자 값을 얻는 방법 어떻게해야합니까? 이것은 지금까지 (내가/다른 경우 경우 제표에 넣어 무엇 확실하지 오전) 내 코드입니다 :

FILE *pFile = fopen("Users/Justin/Desktop/Ledger.txt", "r"); 
    float startingBalance = 1000.00; 
    char action; 

    if(pFile != NULL) 
    { 
     while(!(feof(pFile))) 
     { 
      fgets(action, 1, pFile); 

      if(action == 'D' || action == 'd') 
      { 

      } 
      else if(action == 'C' || action == 'c') 
       { 

       } 
      else 
       printf("IO Error: Problem with file"); 

     } 
    } 



    return 0; 
} 
+1

'는 fgets (액션 , 1, pFile); '컴파일러가 경고를 했습니까? –

+0

['man strtol'] (http://www.manpagez.com/man/3/strtol/) 및 ['man fgets'] (http://www.manpagez.com/man/3/fgets)을 확인하십시오. /). 'fscanf()'를 사용하려고 시도하지 * 않습니다. 왜냐하면 그 함수는 잘못된 입력/읽기 실패에도 불구하고 적절하게 사용하기가 쉽기 때문입니다. – DevSolar

+1

그리고'fgets'의 반환 값을 사용하여 읽기를 종료하고'feof'에 의존하지 마십시오. ('fgets'는 파일의 끝에 도달하면 NULL을 반환합니다.) –

답변

0

파일은 라인으로 구성, 그래서 라인 현명한 읽어 것이 좋습니다된다. 그 함수는 fgets이며, 특정 최대 길이의 전체 행을 char 버퍼로 읽습니다. 그것은 끝나는 개행을 유지합니다. (최대 길이 때문에 줄이 잘리지 않는 한 그 줄을 다루지는 않습니다.) fgets은 파일의 끝에 도달하면 라인 버퍼 또는 NULL을 리턴합니다.

일단 줄이 있으면 그 줄을 검사해야합니다. 귀하의 라인 모든 즉

<action>, <amount> 

그래서 당신이 좋은하지만, 신속하고 더러운하지 sscanf을 사용할 수, 동일한 구문을 가지고있다. ( scanf의 오류 처리는, 예를 들어, 아주 기본적인, 그래서 좋은 전략은 모두 잘못된 형식의 라인을 무시하는 것이다.)

함수의 골격은 다음과 같습니다

int ledger(const char *fn) 
{ 
    FILE *f; 
    char line[80];    /* char buffer for line */ 
    int lineno = 0;    /* for error reporting */ 

    f = fopen(fn, "r"); 
    if (f == NULL) return -1; /* error */ 

    while (fgets(line, sizeof(line), f)) { 
     char action; 
     double amount; 
     int n; 

     lineno++; 
     n = sscanf(line, " %c, %lf", &action, &amount); 

     if (n < 2) { 
      printf("Skipping badly formatted line %d\n", lineno); 
      continue; 
     } 

     /* Do stuff, e.g. just print */ 
     printf("%c, %16.2f\n", action, amount); 
    } 
    fclose(f); 

    return 0; /* success */ 
}