Как разобрать открытый текст из файла в 2d матрицу / массив? - PullRequest
0 голосов
/ 05 января 2012

следующий код, который я написал, должен преобразовать строку, взятую из файла, следующим образом:

(3670, 1882) (1574, 7255) (4814, 8566) (1609, 3153) (9725, 13468) (8297, 3006) (9091, 6989) (8521, 10432) (14669, 12201) (4203, 9729) (469, 2444) (10107, 8318) (1848, 13650) (5423, 847) (11755, 8827) (4451, 4495) (11645, 1670) (10937, 5692) (14533, 13696) (7291, 12158) (1891, 2405) (1776, 4971) (2486, 2499) (13389, 236) (8533, 7531) (10618, 10288) (9119, 11226) (9429, 6622) (12380, 9516) (1698, 5828) (8369, 5101) (11341, 13530) (11955, 2335) (6249, 14435) (9373, 6921) (2977, 2294) (57, 14558) (280, 12847) (13846, 11748) (428, 9004)

в действительную двумерную матрицу.

{{3670, 1882}, {1547, 7255} ...}

Я хороший "питонер", и я мог бы сделать это в одну строку. Я хотел попытаться решить ту же проблему в c (обратите внимание, что я начал возиться с c сегодня); моя попытка следующая (и результат совершенно случайный / неправильный):

FILE *fp;
fp=fopen(argv[1], "rt");

if ( fp != NULL )
{
    char line [1000]; //this is ugly, isn't this?

    while ( fgets ( line, sizeof line, fp ) != NULL ) // read a line 
    {
        line[(strlen(line)-1)] = '\0';
        //line[(strlen(line)-2)] = '\0';
        char* p;
        p = strtok(line, ",)( ");

        int elements[100][2]; //even uglier than before?
        int binpos=0;
        int pos=0;
        while (p != NULL)
        {
            if (p!=NULL){
                if (binpos==0){
                    elements[pos][binpos]=atoi(p);
                    binpos=1;
                }else{
                    p[(strlen(p)-1)] = '\0'; //remove the comma
                    elements[pos][binpos]=atoi(p);
                    pos++;
                    binpos=0;
                }
            }
            p = strtok(NULL, ",)( ");
        }
        int it;
        for (it=0; it<pos; it++){
            printf("(%d, %d)\n",elements[it][0],elements[it][1]);
        }
        return 0;
    }
}

Может кто-нибудь сказать, пожалуйста, как исправить мой беспорядок? :)

1 Ответ

1 голос
/ 06 января 2012

Вы должны использовать fgets только для чтения строк, если строки относятся к тому, что вы анализируете.В вашем случае кажется, что окончания строк не имеют значения, поэтому вам лучше использовать scanf:

printf("{");
const char *sep = "";
int a, b;
while (fscanf(fp, "(%d,%d)", &a, &b) == 2) {
    printf("%s{%d, %d}", sep, a, b);
    sep = ", "; }
printf("}");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...