У меня есть простой файл с целыми числами и символами для чтения. Я читал строку за строкой и сохранял их в массиве символов, а затем отделял пробелы с помощью strtok() и преобразовывал в переменные int с помощью atoi(), но я не могу извлечь один символ в переменную char.
FILE* file=fopen(fileName, "r");
if (file==NULL)
{
perror("Error opening file.");
}
else
{
char line[255];
fgets(line,255,file);
while (fgets(line,255,file))
{
splitLine(line, 255);
fgets(line,255,file);
splitLine(line, 255);
}
void splitLine(char line[], int length)
{
int rowLength=0;
int columnLength=0;
int array[3];
int count=0;
char character;
char *ptr=strtok(line, " ");
while(ptr!=NULL)
{
array[count]=atoi(ptr);
ptr=strtok(NULL, " ");
count++;
}
rowLength=(array[0]);
columnLength=(array[1]);
character=(array[2]);
printf("%d,",rowLength);
printf("%d,",columnLength);
printf("%c\n",character);
}
Для начала этот фрагмент кода
fgets(line,255,file);
while (fgets(line,255,file))
{
splitLine(line, 255);
fgets(line,255,file);
splitLine(line, 255);
}
небезопасно, потому что вы не проверяете результат каждого вызова fgets
.
Второй параметр функции splitLine
является избыточным, поскольку первый переданный аргумент представляет собой строку.
Итак, объявите функцию как
void splitLine( const char line[] );
Внутри функции лучше использовать sscanf
вместо strtok
.
Тем более символ символа называть atoi
не имеет смысла
array[count]=atoi(ptr);
Функция может выглядеть следующим образом
void splitLine( const char line[] )
{
int rowLength;
int columnLength;
char character;
if ( sscanf( line, "%d %d %c", &rowLength, &columnLength, &character ) == 3 )
{
printf("%d,",rowLength);
printf("%d,",columnLength);
printf("%c\n",character);
}
//...
}
Вы делаете разные вещи для каждого столбца, так зачем использовать массив?
char *ptr=strtok(line, " ");
for (count=0; i < 3; i++) {
if (ptr == NULL)
break;
switch(count) {
case 0:
rowlength = atoi(ptr);
break;
case 1:
columnLength = atoi(ptr);
break;
case 2:
character = *ptr;
break;
}
ptr=strtok(NULL, " ");
}
Здравствуйте, большое спасибо за ваш ответ, но все же это не сработало для меня, приятель. Целочисленные значения читаются нормально, но не значение char. Любая причина, почему?