fgets и strtok в двойном цикле "for" - PullRequest
1 голос
/ 17 марта 2012

Я пытаюсь извлечь содержимое файла в матрицу, но файл может выглядеть совершенно иначе.

Например, все эти файлы должны давать одинаковый результат: матрица 3x3, содержащая 1,2,3,4,5,6,7,8,9.


1 2 3 
4 5 6
7 8 9

1  2  3 
4 5 6
7         8 9

1 2 3 4
5
6
7   8 
9

1 2 3
$something
$something else
4 5 6
$something else else
7 8 9

Надеюсь, я заранее знаю размеры матрицы, а также символ "$", который указывает, что эти строки должны игнорироваться в текущем процессе.

Мой текущий алгоритм с использованием fscanf прекрасно работает, но он не может работать со строками "$ что-то".

Я подумал, что мне следует использовать метод fgets / strtok / sscanf, но есть некоторые проблемы.

// File* file (already assigned)
char line[32]; //assuming 32 is enough
char* token;

fgets(line,32,file);
token = strtok(line," \t");

for (y=0; y<ySize; y++)
{
    for (x=0; x<xSize, x++)
    {
        if (token[0] == '$') //should use a str function
        {
            fgets(line,32,file);
            token = strtok(line," \t")
            x--;
        }
        else
        {
            if (we are at the end of the line)
            {
                fgets(line,32,file);
                token = strtok(line," \t")
            }
            sscanf(token,"%d",&matrix[x][y];
            token = strtok(NULL," \t");
        }
    }
}

По сути, я хотел бы получить некоторую помощь для написания условия "если (мы находимся в конце строки)" и некоторый ввод для моего метода, это безупречно? Я правильно подумал о процессе?

Спасибо.

Ответы [ 2 ]

1 голос
/ 17 марта 2012

Вы должны использовать getline вместо fgets, чтобы упростить задачу. Последнее ненадежно. Тестовое условие, которое вы ищете:

token == NULL;

Проверьте this : "Как только в вызове strtok найден завершающий нулевой символ str, все последующие вызовы этой функции с нулевым указателем в качестве первого аргумента возвращают нулевой указатель."

0 голосов
/ 17 марта 2012

Вы можете легко разобрать без strtok (), используя strspn () / strcspn () и sscanf () s "% n". Также: в исходном коде было «,», где «;» должен был быть.

#include <stdio.h>
#include <string.h>

#define XSIZE 3
#define YSIZE 3

int matrix[XSIZE][YSIZE];

int main(void)
{
char line[200];
int pos,eat,xx,yy, rc;

xx = yy =0;
while ( fgets(line, sizeof line, stdin) ) {
    if (line[0] == '$') continue;
    for(pos=0; line[pos]; pos += eat) {
       pos += strspn(line+pos, " \t\n");
       rc =sscanf(line+pos, "%d%n", &matrix[xx][yy], &eat);
       if (rc < 1) break;
       if (++xx >= XSIZE ) {xx = 0; if(++yy >= YSIZE) goto done; }
       }   
     }
done:
        /* show it to the world ... */
for (yy = 0; yy < YSIZE; yy++) {
    for (xx = 0; xx < XSIZE; xx++) {
        fprintf (stdout, " %d", matrix[xx][yy] );
        }       
    fprintf (stdout, "\n" );
    }   
return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...