2014-09-15 2 views
0

읽으려는 행렬을 나타내는 파일에 헤더 행이 있습니다.atoi()를 사용하여 두 개의 정수 값에 대한 행을 읽습니다.

R4 C4 
1 0 0 0 
0 1 0 0 
0 0 1 0 
0 0 0 1 

내가 원하는 것은이 경우 '4'의 첫 번째 줄을 읽습니다. 그러나 숫자는 임의의 길이 일 수 있습니다 (어느 정도까지).

int main() 
{ 
FILE * pFile; 
FILE * pFile2; 
pFile = fopen ("A.txt","r"); 
pFile2 = fopen ("B.txt","r"); 
char c; 
int lincount = 0; 
int rows; 
int columns; 
if (pFile == NULL) perror ("Error opening file"); 
else{ 
while ((c = fgetc(pFile)) != '\n') 
{ 
    if(c == 'R'){ 
    c = fgetc(pFile); 
    rows = atoi(c); 
    } 
    if(c == 'C'){ 
    c = fgetc(pFile); 
    columns = atoi(c); 
    break; 
    } 
} 
lincount++; 
printf("Rows is %d and Columns is %d\n", rows, columns); 
} 

내가 컴파일 얻을 오류가 나는 atoi 함수()가 작동하는 방법이나 이해가 안 돼요

warning: passing argument 1 of ‘atoi’ makes pointer from integer without a cast 
[enabled by default] 
/usr/include/stdlib.h:148:12: note: expected ‘const char *’ but argument is of type 
‘char’ 

입니다 : 일부 검색 후 난 그 atoi 함수() (아마도) 트릭을 할 수있는 발견 이 문제를 해결하기 위해 문서에서 도움이되지 않는다. 왜냐하면 예제에서 문자를 입력하는 것처럼 보이기 때문에 atoi()에 대한 입력이 포인터 일 수 있음을 발견했다는 것을 이해할 수 없기 때문이다.

+0

대신

if(c == 'R'){ c = fgetc(pFile); rows = atoi(c); } if(c == 'C'){ c = fgetc(pFile); columns = atoi(c); break; } 

변화는 다음 [**'strtol 함수()'**] (http로를 걸어 행 버퍼에 전체 라인을 읽기 : // en.cppreference.com/w/c/string/byte/strtol), 줄 끝까지 입력을 더 이상 처리 할 수 ​​없을 때까지 각 값을 저장합니다. 끝나면 반환되는 값의 수는'C' 또는 파일 형식이 잘못된 숫자 바로 뒤에 표시됩니다. – WhozCraig

답변

0

먼저, atoi은 인수로 char *을 취합니다. 그리고 char을 제공하고 있습니다.

숫자가 가변적 일 수 있습니다. 따라서 코드의 일부분을 약간 변경하면 더 좋을 것입니다.

int row; 
int column; 

if(c == 'R'){ 
    fscanf(pFile, "%d", &row); 
    //rows = atoi(c); <----No need of atoi 
    } 
    if(c == 'C'){ 
    fscanf(pFile, "%d", &column); 
    //columns = atoi(c); <----No need of atoi 
    break; 
    } 
+0

정확하게 이해할 수 있도록 fscanf는 숫자와 C 사이의 공간에 도달 할 때까지 스캔합니다. 좋아요 : R4 C4 – AAC

+0

예, 공백까지 하나의 정수로 연속 숫자를 읽습니다. – Arpit

관련 문제