2014-01-12 1 views
1

문자로 파일 문자를 읽고 문자로 숫자를 설정하는 방법이 있습니까? 내 파일문자와 문자에 대해 문자를 읽습니다. 숫자에는 숫자가 설정됩니다.

while ((c = fgetc(pFile)) != EOF) 
{ 
    //my work 
} 

입니다

bob 4567 
joe 39083 
sara 4239824 

나는이 내 문자에서 작동 알고있다. 이 방법은 원하는 방식으로 숫자를 읽지 않습니다. b, o, b, space, 4,5,6,7을 읽습니다. b, o, b, space, 4567을 읽으 렴. 그 이유는 결국 4567 plus 39083 plus 4239824를 추가하는 것입니다.

UPDATE 12-20

하여 파일을 처리 fscanf CAN을 통해 모든 방법이 일치하지 않는 경우? 때로는 파일이 "단어 번호"이고 다른 시간은 "단어"입니다. 이렇게

bob 456 
echo 
cat 
dog 1101 
peacock 300 

이것은 작동하는 것으로 보이며 이에 놀란다. 나는 fsacnf가 일관성이없는 파일을 좋아한다고 생각하지 않았습니다.

while (fscanf(pFile, "%s %d", nam, &val) !=EOF) 
{ 
    //my work 
} 

답변

3

하면, 배열에 숫자를 읽을 수 후 atoi 또는 (바람직하게) strtol 함께 int 해당 변환한다.

다른 방법으로는 문자를 읽고 공간에 도달하면 중지하고 [f]scanf과 같은 번호를 읽을 수 있습니다 (물론 [f]fscanf으로 읽을 수도 있습니다).

편집 :

선택을 감안할 때, 아마 같은 것을 할 것 :

char name[16]; 
int number; 

fscanf(input_file, "%15s %d", name, &number); 
+0

'atoi' 내가 사용에 대한 계획 한 사실이었다. 불행히도 fgetc는 실제로 숫자를 좋아하지 않는 것 같습니다. 어떻게 든 그것은 25505,53으로 25 세가되었습니다. 이게 어떻게 가능한지 정말 이해가 안돼 .fscanf에서 뭘 추천하는지 설명해 줄래? – cokedude

+0

fsanf가 일관성없는 파일을 처리 할 수 ​​있습니까? 이것이 내가 한 일이며 나는 어떤 문제도 없었 음에 놀랐습니다. 'while (fscanf (pFile, "% s % d", nam, & val)! = EOF)'. – cokedude

+0

@cokedude : 예, 아니오. 무슨 일이 일어날 지 fscanf가 정수를 변환하지 못한다면,'number'의 기존 값을 수정하지 않고 리턴 할 것입니다. 문자열이 없어도 문제가 될 수 있습니다. 이 경우 숫자는 문자열로 읽혀집니다. –

1
#include <stdio.h> 
#include <stdlib.h> 
#include <ctype.h> 

enum { SPACE, STRING, NUMBER, END }; 

int main(void){ 
    FILE *pFile = stdin;//Mock 
    char buffer[32]; 
    int i, c, kind, number; 
    unsigned long long sum =0; 

    i = 0; kind = SPACE; 
    while((c = fgetc(pFile)) != EOF){//&& i< suzeof(buffer) 
     buffer[i] = c; 
     if(isdigit(c)){ 
      kind = NUMBER; 
      ++i; 
     } else if(isspace(c)){ 
      buffer[i] = '\0'; 
      if(kind == STRING){ 
       printf("%s\n", buffer); 
      } else if(kind == NUMBER){ 
       number = atoi(buffer); 
       printf("%d\n", number); 
       sum += number; 
      } 
      kind = SPACE; 
      i = 0; 
     } else { 
      kind = STRING; 
      ++i; 
     } 
    } 
    printf("sum : %llu\n", sum); 
    return 0; 
} 
+0

참고 : 버퍼가 가득 차면 결과가 올바르지 않습니다. 마지막 줄에 새 줄이 없으면 줄은 무시됩니다. – BLUEPIXY

+0

프로그램을 컴파일하고 실행 한 후에 뭔가를 입력해야한다는 것을 알고 있습니다. 내가 타이핑하고 싶은 모든 것을 타이프 한 후에 무엇을하고 싶니? 나는 여러 번, \ n, EOF, 0, 1, 2를 입력하려고 시도했다. 나는 ctrl + c를 치고 프로그램을 죽이는 것을 제외하고는 어떻게 끝내야할지 모르겠다. – cokedude

+0

@cokedude 파일 포인터가'fopen' real에 의한 파일 포인터라면 문제가 없습니다. 샘플로'stdin'을해야한다면'CTRL + Z' (윈도우의 경우) 또는'CTRL + D' (유닉스 클랜의 경우)를 입력하십시오. – BLUEPIXY

관련 문제