fscanf для int и array - PullRequest
       90

fscanf для int и array

0 голосов
/ 26 ноября 2018

Я получаю файл в качестве аргумента в программе на C

Каждая строка имеет разные числа целого числа, например:

1 2 4 5 6
7 8 8 9 10 -1 2 3
12 3 4 -2 2 -3 9 2 4

Я хочу получить первые 2 аргумента каждогострока в некоторый int, а все остальные - в массив, примерно такой для строки # 2:

int a;
int b;
int c[10];

int a = 7;
int b = 8;
int c = [8,9,10,-1,1,2,3]

Я могу получить первые 2, но не могу сделать так, чтобы это происходило для массива.

Буду признателен за любую помощь

Это то, что я имею сейчас:

//get line per line until \n
while (fscanf(fp, "%d %d", a, b) != EOF)
    while (fscanf(fp,"%d [^\n]", c[n]) != EOF)
        n++;

// print each line
for ( int k = 0 ; k < 10; k ++)
    printf("%d %d %d \n", a, b, c[k]);

Ответы [ 2 ]

0 голосов
/ 26 ноября 2018

Чтение C чтение файла строка за строкой и Как извлечь числа из строки в c? , и тогда вы получите что-то вроде этого:

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

int main(void) {
    FILE * fp;
    char * line = NULL;
    size_t len = 0;
    ssize_t read;

    fp = fopen("input.txt", "r");
    if (fp == NULL)
        return -1;

    while ((read = getline(&line, &len, fp)) != -1) {
        printf("Retrieved line of length %zu:\n", read);
        //printf("%s", line);
        char* p = line;
    int a, b, c[10], counter = -2;
    while (*p) { // While there are more characters to process...
            if ( isdigit(*p) || ( (*p=='-'||*p=='+') && isdigit(*(p+1)) )) {
                // Found a number
                long val = strtol(p, &p, 10); // Read number
                //printf("%ld\n", val); // and print it.
            if(counter == -2)
                a = val;
            else if(counter == -1)
                b = val;
            else if(counter < 10)
                c[counter] = val;
            counter++;
            } else {
                // Otherwise, move on to the next character.
                p++;
            }
    }
    printf("a = %d, b = %d\n", a, b);
    for(int i = 0; i < counter; ++i)
        printf("%d ", c[i]);
    printf("\n");
    }

    fclose(fp);
    if (line)
        free(line);
    return 0;
}

Вывод:

Retrieved line of length 10:
a = 1, b = 2
4 5 6 
Retrieved line of length 18:
a = 7, b = 8
8 9 10 -1 2 3 
Retrieved line of length 21:
a = 12, b = 3
4 -2 2 -3 9 2 4 
0 голосов
/ 26 ноября 2018

Разделение строк с помощью fscanf может быть сложным.Вам лучше прочитать одну строку с помощью fgets, а затем с помощью sscanf прочитать числа оттуда.

Кроме того, fscanf и sscanf возвращают количество соответствующих элементов.Вы не должны проверять EOF.

char line[300];
while (fgets(line, sizeof(line), fp)) {
    int rval = sscanf(line, "%d %d", &a, &b);
    if (rval == 2) {
        int count = 0;
        do {
            rval = sscanf(line, "%d", &c[count++]);
        } while (rval == 1);
    } 
}
...