2014-10-07 3 views
0

저는 C 언어를 배우며 텍스트 파일에서 정수를 읽고 배열에 저장하는 작은 프로그램을 작성하여 연습하고 있습니다. 그러나 정수는 절대로 저장되지 않으며 배열은 비어 있습니다. 사전에fgetc 작업에 문제가 발생했습니다.

1 2 3 4 5 6 7 8 9 

감사 :

int readNumbers(int array[], char* fname) {                                                
78                                          
79                                                
80  int numberRead = 0;                                                     
81  FILE* fp;                                                        
82  int ch;                                                        
83  int i = 0;                                                        
84                                                           
85                                               
86                                                         
87  fp = fopen(fname, "r");                                                    
88  // Test to see if the file was opened correctly                                              
89                                                         
90  if (fp == NULL) {                                                      
91    printf("Error opening file\n");                                                
92    return;                                                      
93  }                                                          
94  // Now read until end of file                                                   
95                                                         
96  while (ch = fgetc(fp) != EOF && isdigit(ch)) {                                               
97    array[i++] = ch;                                                    
98  }                                                          
99  if (ferror(fp)) {                                                      
100    return;                                                      
101  }                                                          
102  // Close the file pointer                                                    
103                                                         
104  fclose(fp);                                                       
105                                                           
106  // Return the number of items read                                                  
107  return numberRead;                                           
108 } 

텍스트 파일은 다음과 같이 될 것이다.

코드를 업데이트했습니다. 이것은 거의 작동하지만 55 같은 문자를 55으로 해석합니다. 따라서 배열에는 두 개의 5이 있습니다.

while ((ch =fgetc(fp)) != EOF) {                                                  
97    if (ch != ' ' && ch != '\n') {                                                 
98      array[counter] = ch - '0';                                                
99      counter++;                                                    
100      numberRead++;                                                   
101    }                                                        
102  } 
+2

변화는 fgetc '= CH (FP)! = EOF'에'(CH2 =는 fgetc (FP))! = EOF'. 비교 연산자는 할당보다 우선 순위가 높습니다. –

+0

'ferror'가 약간 이상한 경우 파일을 닫지 않고 함수가 반환됩니다. 또한 인수없이'return; '을 갖는 것은 불법입니다. –

+0

@MattMcNabb 감사합니다! – mrQWERTY

답변

1

무엇 매트 McNabb에 확장 (TRUE 또는 FALSE) 1 또는 0 fgetc(fp) != EOF의 값 덧글에서, void 함수 안에 있지 않는 한, 값없이 return을 가질 수 없다고 말했습니다. readNumbers() 함수는 int을 반환하도록 선언되었으므로 모두 반환 경로는 int를 반환해야합니다. 0이 (종류의 :)이기 때문에 파일 오류가 있으면 -1을 반환하는 것이 좋을 수 있습니다. 유효한 문자 수를 읽을 수 있습니다.

입력 파일의 숫자 사이에 공백이 있으므로 while 루프의 논리를 변경해야합니다. 이 숫자가 아닌 문자를 읽는

while ((ch = fgetc(fp)) != EOF && isdigit(ch))

즉시 실패합니다.

또한 내가 읽는 각 문자의 숫자 값을 배열에 저장한다는 사실을 언급해야합니다. 이는 원하는 것이 아닐 수도 있습니다. 예를 들어 ASCII의 '0'문자는 숫자 값이 48이고 '1'값은 49입니다.

PS.


봅니다 때 실제, 프로그램 내에서 깊은 exit()을 사용하지, 그냥 main()에서 사용하는 ... readNumbers()를 호출하는 기능이 가능한 결과를 처리 할 수있을만큼 큰 배열을 제공해야합니다. 또한, 단지 exit()으로 죽은 프로그램을 죽이는 것이 아니라 일종의 오류 메시지 (보통 stderr)를 인쇄하는 것이 더 좋으며 다음에이 정상적으로 죽습니다. 적절한 오류 메시지를 만드는 방법은 <stdio.h> 기능 perror()을 확인하고 <errno.h>을 확인하십시오.

readNumbers()에 오류 메시지를 출력하고 -1을 반환 한 다음 호출 기능 (예 : main())이 프로그램의 오류가 너무 나쁜지 판단 할 수 있습니다. 또는 호출 함수가 오류 메시지의 인쇄를 처리하도록합니다.

+0

끝내기 -1 대신에 exit (0)을 사용하는 것은 어떨까요? – mrQWERTY

1

당신이 우리를 여기에 괄호 while (ch = fgetc(fp) != EOF && isdigit(ch))해야, 그것은 while ((ch = fgetc(fp)) != EOF && isdigit(ch)) 그렇지 않으면 당신이 ch에 저장할 수 있어야 eather

1
// this following code modification will handle your most recent question 

int value = 0; // place to accumulate numbers 
int inNumber = 0; // to avoid spurious input in array[] 

// note: the following expects that 'ch' is defined as an integer 
while ((ch =fgetc(fp)) != EOF) 
{ 
    if (ch >= '0' && ch <= '9') // only process numeric characters 
    { 
     value *= 10; 
     value += (ch - 0x30); // convert alpha to binary 
     inNumber = 1; 
    } 
    else 
    { // break between numbers 
     if(1 == inNumber) 
     { 
      array[counter] = value; 
      counter++; 
      numberRead++; 
      value = 0; // reset for next number 
      inNumber = 0; 
     } 
    } 
} 
관련 문제