как получить указанные c строк из файла CSV? - PullRequest
0 голосов
/ 31 января 2020

Я написал код, в котором я пытаюсь получить все строки, которые начинаются с "A" . У меня есть A, A12 et c в моем CSV-файле, и я хочу прочитать все эти строки. Но я получил следующую ошибку. Не уверен, где я ошибся. Пожалуйста, помогите.

CSV-файл

M,2,lion
A,1,tiger
B,2,cat
A1,7,dog
C,3,man
A2,9,mouse
A23,9,pouch

myfile. c

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

#define NUMLETTERS 100

typedef struct {
    char letter[100];
    int number;
    char ani[100];
} record_t;

int main(void) {
    FILE *fp;
    record_t records[NUMLETTERS];
    size_t count = 0;

    fp = fopen("letters.csv", "r");
    if (fp == NULL) {
        fprintf(stderr, "Error reading file\n");
        return 1;
    }

    while (fscanf(fp, " %s,%d,%s", records[count].letter, &records[count].number, records[count].ani) == 3) {
        count++;
    }

    for (size_t i = 0; i < count; i++) {
        if(records[i].letter== "A"){
        printf("%s,%d,%s\n", records[i].letter, records[i].number,records[i].number);
    }
    }

    fclose(fp);

    return 0;
} 

Ошибка

myfile.c:29:16: warning: format ‘%s’ expects argument of type ‘char *’, but argument 4 has type ‘int’ [-Wformat=]
         printf("%s,%d,%s\n", records[i].letter, records[i].number,records[i].number);

1 Ответ

0 голосов
/ 31 января 2020

Поскольку вы ищете поля, которые начинаются с A, вам нужно сравнить только первую букву letter, поэтому ваша строка 28 становится такой:

if(records[i].letter[0] == 'A'){

И ваш компилятор сказал вам, что вы пытаетесь чтобы отобразить целое число в виде строки, это потому, что у вас есть опечатка в строке 29: number вместо ani, строка должна быть:

printf("%s,%d,%s\n", records[i].letter, records[i].number,records[i].ani);

Извините, я получил свой вывод, но некоторые дополнительные столбцы добавлены в мои выходные данные как «0» A, 1, тигр, 0, A1,7, собака, 0, A2,9, мышь, 0, A23,9, сумка, 0, - Abhik 2 часа a go

Он приходит с вашего scanf вызова: в scanf, %s будет читать до тех пор, пока не будет найден пробел (пробел, табуляция или перевод строки). Вы должны указать scanf прекратить чтение letter после первой найденной запятой. Для этого замените %s на %99[^,]. Больше объяснений здесь: Руководство по Scanf .

Таким образом, ваше чтение l oop должно выглядеть так:

while (fscanf(fp, " %99[^,],%d,%s", records[count].letter, &records[count].number, records[count].ani) == 3) {
    count++;
}
...