Почему эта программа не печатает мой файл? - PullRequest
1 голос
/ 29 апреля 2019

Этот код должен печатать информацию, введенную пользователем в файл, но все, что он делает, это создает пустой файл ...

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

struct room
{
    int room;
    char type[9];
    int cap;
    int price;
}rm;
FILE *k;
int main(){
    struct room rm;
    k=fopen("rooms.txt","w");
    printf("Please enter room number:");
    scanf("%d", rm.room);
    printf("\nPlease enter a description:");
    scanf("%s", rm.type);
    printf("\nPlease enter the room capacity:");
    scanf("%d", rm.cap);
    printf("\nPlease enter the price:");
    scanf("%d", rm.price);
    fprintf(k,"%d\t %s\t %d\t %d\n", rm.room,rm.type,rm.cap,rm.price);
    fclose(k);
}

Ответы [ 2 ]

4 голосов
/ 29 апреля 2019

Здесь

struct room
{
    int room;
    char type[9];
    int cap;
    int price;
}rm;

rm.room, rm.cap и rm.price относятся к типу int, при сканировании ввода от пользователя вам необходимо указать адрес &, чтобы сохранить в нем целое число. Например, замените это

scanf("%d", rm.room); /* to store something into rm.room need to provide address */

с

scanf("%d", &rm.room);

и это

scanf("%d", rm.cap); /* address is not provided */
scanf("%d", rm.price); /* address is not provided */

с

scanf("%d", &rm.cap);
scanf("%d", &rm.price);

Также проверьте тип возврата fopen(). например,

k=fopen("rooms.txt","w");
if(k == NULL) {
 /* @TODO error handling */
 fprintf(stderr, "failure message\n");
 return 0;
}
0 голосов
/ 30 апреля 2019

следующий предложенный код:

  1. чисто компилируется
  2. включает комментарии к вопросу
  3. выполняет желаемую функциональность
  4. не включаетфайлы заголовков, содержимое которых не используется
  5. правильно проверяет наличие ошибок
  6. учитывает правое поле печатной страницы
  7. исключает любую возможность переполнения буфера и результирующего неопределенного поведения
  8. помнит, что ссылка на массив ухудшается до адреса первого байта массива
  9. всегда передает адрес в качестве параметра функции: scanf()
  10. документирует, почему каждый заголовокфайл включен
  11. отделяет определение структуры от экземпляра структуры
  12. не объявляет экземпляр структуры, который «затенен» другим экземпляром структуры с тем же именем
  13. использует одну из действительных сигнатур для функции: main()

и теперь предложенный код:

#include <stdio.h>   // fprintf(), fopen(), fclose(), perror(), scanf()
#include <stdlib.h>  // EXIT_FAILURE, exit()

struct room
{
    int room;
    char type[9];
    int cap;
    int price;
};


int main( void )
{
    struct room rm;

    FILE *k = fopen("rooms.txt","w");
    if( !k )
    {
        perror( "fopen rooms.txt for writing failed" );
        exit( EXIT_FAILURE );
    }

    printf("Please enter a room number:");
    if( scanf("%d", &rm.room) != 1 )
    {
        fprintf( stderr, 
                 "scanf for -room number- failed\n" );
        fclose( k );
        exit( EXIT_FAILURE );
    }

    printf("\nPlease enter a room description:");
    if( scanf("%8s", rm.type) != 1 )
    {
        fprintf( stderr, 
                 "scanf for -room description- failed\n" );
        fclose( k );
        exit( EXIT_FAILURE );
    }

    printf("\nPlease enter the room capacity:");
    if( scanf("%d", &rm.cap) != 1 )
    {
        fprintf( stderr, 
                 "scanf for -room capacity- failed\n" );
        fclose( k );
        exit( EXIT_FAILURE );
    }

    printf("\nPlease enter the room price:");
    if( scanf("%d", &rm.price) != 1 )
    {
        fprintf( stderr, 
                 "scanf for -room price- failed\n" );
        fclose( k );
        exit( EXIT_FAILURE );
    }

    // multi lined parameters to honor right page margin
    fprintf(k,"%d\t %s\t %d\t %d\n", 
        rm.room,
        rm.type,
        rm.cap,
        rm.price);
    fclose(k);
}

в ответена вопрос OP: Почему эта программа не печатает в моем файле?

Поскольку отправленный код ничего не вводит из-за неправильного синтаксиса для параметров функции scanf()

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