Прочитайте строку для 2 отдельных целочисленных значений, используя atoi()

У меня есть строка заголовка в файле, представляющая матрицу, которую я хочу прочитать, например.

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

Что я хочу сделать, так это прочитать первую строку для «4» в этом случае. Но числа могут быть произвольной длины (до некоторой степени). После некоторых поисков я обнаружил, что atoi() может помочь (возможно):

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);
}

Ошибка, которую я получаю при компиляции,

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() может быть указателем, поскольку кажется, они просто вводят символы в примерах.


person AAC    schedule 15.09.2014    source источник
comment
Считайте всю строку в буфер строк, а затем перейдите по ней с помощью strtol()< /b>, сохраняя каждое значение до тех пор, пока вы не дойдете до конца строки и не сможете больше обрабатывать ввод. Когда закончите, число возвращаемых значений должно быть числом сразу после C, иначе ваш файл имеет неправильный формат.   -  person WhozCraig    schedule 16.09.2014


Ответы (1)


Во-первых, atoi принимает char * в качестве аргумента. И вы предоставляете char.

Как вы сказали, числа могут быть переменной длины. Поэтому будет лучше, если вы внесете некоторые изменения в приведенную ниже часть кода.

Вместо

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

изменить его на

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;
    }
person Arpit    schedule 15.09.2014
comment
Я правильно понимаю, что fscanf будет сканировать, пока не встретит пробел между цифрой и C? Например: R4 C4 - person AAC; 16.09.2014
comment
Да, он будет читать непрерывные цифры как одно целое число до пробела. - person Arpit; 16.09.2014