по какой-то причине мои данные не добавляются в мой файл с моей функцией c - PullRequest
1 голос
/ 25 мая 2020

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

вот функция и структура:

struct library{
int id;
int qty;
char name[50];
};
void InsertBook()
{
    struct library b;
    FILE *books;
    if((books=fopen("C:\\mybooks.txt","a+")==NULL))
    {
        printf("file not found\n");
    }
    else
    {
        printf("You will need to enter a name, ID, and quantity of the book.\n");
        printf("please enter book name:");
        fflush(stdin);
        fgets(b.name,SIZE,stdin);
        fputs(b.name,books);
        printf("please enter book ID:");
        scanf("%d",&b.id);
        printf("please enter book quantity:");
        scanf("%d",&b.qty);
        fprintf(books,"%d %s %d\n",b.name,b.id,b.qty);
        fclose(books);
    }
}```

Ответы [ 2 ]

0 голосов
/ 25 мая 2020

Программа работает (но ошибки видны ниже), однако вы выполняете запись в папку root на Диске C. Выходной файл виден из консоли, но не из файлового проводника Windows. Обычно вам не следует использовать папку root на диске C.

Здесь круглые скобки поставлены не в том месте

if((books=fopen("mybooks.txt","a+")==NULL))

, что должно быть

if((books = fopen("mybooks.txt","a+")) == NULL)

Здесь указаны неправильные спецификации формата, неправильные в fprintf, поскольку компилятор жаловался на

fprintf(books,"%d %s %d\n",b.name,b.id,b.qty);

должно быть

fprintf(books, "%s %d %d\n", b.name, b.id, b.qty);

Вы излишне дублируете запись названия книги в файл несколько строк выше с

fputs(b.name,books);

Вы используете неправильный размер буфера для fgets здесь

fgets(b.name,SIZE,stdin);

, который должен быть

fgets(b.name, sizeof b.name, stdin);

Кроме того, вы должны проверить возвращаемые значения, особенно из функций пользовательского ввода, таких как fgets и scanf.


Кроме того, при вводе названия книги здесь ожидаются ошибки.
fgets(b.name, sizeof b.name, stdin);

Поэтому я предлагаю вам заменить эту строку на

if(scanf("%49[^\n]", b.name) != 1)
    exit(1);

Лучше не смешивать способы ввода: выберите один.

0 голосов
/ 25 мая 2020

Единственная ошибка, которую вы сделали:

fprintf(books, "%d %s %d\n", b.name, b.id, b.qty);

Просто сделайте:

fprintf(books, "%s %d %d\n", b.name, b.id, b.qty); // %s before %d

И все в порядке.

Боковые подсказки

  • fputs() здесь не требуется.
  • books = fopen("C:\\mybooks.txt", "a+") == NULL выражение не будет работать для большинства компиляторов, потому что присвоение делает указатель из целого числа без приведения.

    Вместо этого вы можно присвоить его перед сравнением с нулевым выражением, как показано:

    books = fopen("C:\\mybooks.txt", "a+");
    if (books == NULL) { ... }```
    

Важное примечание: Убедитесь, что у вас есть разрешение на запись в этом месте назначения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...