Как читать или хранить целые числа, читая построчно в C? - PullRequest
1 голос
/ 04 июня 2011

Я пытаюсь прочитать строку чисел и сделать некоторые вычисления на них. Тем не менее, мне нужно, чтобы они были как-то разделены построчно, но я не могу понять, как это сделать. Вот мой код:

int main()
{
    int infor[1024]; //2-d array perhaps??
    int n, i;

    i=0;

    int imgWidth, imgHeight, safeRegionStart, safeRegionWidth;
    FILE *fp;

    fp = stdin;

    while (!feof(fp))
    {
        fscanf(fp, "%d", &infor[i++]);
    }
}

Вход выглядит примерно так:

4 3 1 2 -16777216 -16711936 -65536 -16777216 -1 -65536 -65536 -16711936 -16777216 -65536 -16711936 -16777216     
3 4 1 1 -16777216 -16711936 -1 -1 -65536 -16777216 -16777216 -65536 -1 -1 -65536 -16711936 

Может кто-нибудь объяснить, как перейти от строки к строке?


EDIT:

int main()
{
    FILE * fp = stdin;
    char buffer[1024];
    long arr[2][16];

    int i = 0,
        j = 0;

    char * pEnd;

    while(fgets(buffer, sizeof(buffer), fp))
    {
        j = 0;
        if(buffer[0] == '\n')
            continue;

        pEnd = buffer;
        while(*pEnd != '\0')
        {
            arr[i][j++]=strtol(pEnd,&pEnd,10);
        }

        i++;
    }

    int imgWidth,
        imgHeight,
        safeRegionStart,
        safeRegionWidth;

    imgWidth = arr[1][0];
    imgHeight = arr[1][1];
    safeRegionStart = arr[1][2];
    safeRegionWidth = arr[1][3];

    printf("Value of i is %d\n", i);
    printf("%d %d %d %d ",
           imgWidth,
           imgHeight,
           safeRegionStart,
           safeRegionWidth);

    return 0;
}

1 Ответ

3 голосов
/ 04 июня 2011

Я думаю, что ваша идея двумерного массива, вероятно, правильная, особенно если вы хотите разделить точки данных.Используйте fgets, чтобы ввести каждую строку как строку, затем используйте цикл с sscanf, чтобы разобрать отдельные числа в одну строку массива.Функция, подобная strtol, может использоваться вместо шага sscanf для непосредственного получения чисел.

Например * (вам необходимо настроить размер буфера и размеры массива, но для файла данных, который вы дали): (изменения, сделанные для подхода stdin)

 #include <stdio.h>

int main(){

    char buffer[1024];
    long arr[2][16];
    int i = 0,j=0;
    char * pEnd;
    FILE *fp = stdin;
    while(fgets(buffer,sizeof(buffer),fp))
    {
        j=0;
        if(buffer[0]=='\n')
            continue;

        pEnd = buffer;
        while(*pEnd !='\0')
        {
            arr[i][j++]=strtol(pEnd,&pEnd,10);

        }

        i++;
    }

fclose(fp);
printf("arr[0][0]=%d  arr[0][1]=%d  arr[0][2]=%d\n",arr[0][0],arr[0][1],arr[0][2]);
printf("arr[1][0]=%d  arr[1][1]=%d  arr[1][2]=%d\n",arr[1][0],arr[1][1],arr[1][2]);


}

exe-файл с именем rowdata2 и текстовый файл rowdata.txt, поэтому я запустил его как rowdata2 < rowdata.txt и получил правильные результаты.

[*] Он не выиграет ни одного конкурса красоты

...