2013-09-30 2 views
-6

Я новичок в C. Я пытаюсь создать программу C как простую систему билетов для практики.помогите написать структуру в двоичный файл

Я хочу написать структуру в двоичный файл, а затем прочитать его. но он ничего не записывает в двоичный файл.

То, что я получил только

Файл успешно закрыт.

Файл успешно закрыт.

Бинарный файл (ticket.bin) по-прежнему пуст.

Если кто-нибудь может ввести пример, чтобы помочь мне понять, как писать структуру в двоичный файл и читать его.

define STATIONNUM 10//Maximun number of station. 

define rate1 160 

define rate2 190 

define rate3 230 

struct Ticket{ 

    int code;//code of the list 
    char station[20];//destination name. 
    int price;//transportation fee. 
}; 



int main(){ 

    FILE *fp; 
    int c;//for open close judgement return value. 
    int i;//use at for loop. 

    struct Ticket list[STATIONNUM]={ 
    {1, "NewYork", rate1}, 
    {2, "London", rate1}, 
    {3, "Paris", rate1}, 
    {4, "Tokyo", rate1}, 
    {5, "HongKong ", rate2}, 
    {6, "Sydney", rate2}, 
    {7, "Milan", rate2}, 
    {8, "Berlin", rate2}, 
    {9, "Vancouver", rate3}, 
    {10, "Afghanistan", rate3}, 
    }; 

    //open a binary file to write. 
    fp = fopen("ticket.bin", "wb"); 
    if(! fp){ 
     printf("open file fail"); 
    } 

    //write data into binary file. 
    if (fwrite(list, sizeof(list[0]), STATIONNUM, fp) != STATIONNUM); 

    //close it. 
    c = fclose(fp); 

    //judge if it's closed. 
    if(c == -1){ 
     printf("File close failed.\n"); 
    }else if(c == 0){ 
     printf("File successfully closed.\n"); 
    } 

    //open binary file to read. 
    fp = fopen("ticket.bin", "rb"); 
    if(! fp){ 
     printf("open file fail"); 
    } 

    fread(list, sizeof(struct Ticket), STATIONNUM, fp); 

    //close it. 
    c = fclose(fp); 

    //judge if it's closed. 
    if(c == -1){ 
     printf("File close failed.\n"); 
    }else if(c == 0){ 
     printf("File successfully closed.\n"); 
    } 

} 
+0

Является ли это 'C#' или 'C++'? –

+0

Похож на C++. –

+1

Выглядит больше как C (fopen/printf), хотя все это можно использовать в C++. – Nikhil

ответ

1

Ваша линия

if (fwrite(list, sizeof(list[0]), STATIONNUM, fp) != STATIONNUM); 

должен быть по крайней мере

if (fwrite(list, sizeof(struct Ticket), 
      STATIONNUM, fp) != STATIONNUM) 
    { perror("fwrite"); exit(EXIT_FAILURE); }; 

и вы можете рассмотреть возможность сделать if (fflush(fp)) perror("fflush"); после этого.

и вы, очевидно, забыл

if fread(list, sizeof(struct Ticket), 
      STATIONNUM, fp) != STATIONNUM) 
    { perror("fread"); exit(EXIT_FAILURE); }; 

после успешного fp = fopen("ticket.bin", "rb"); линии.

Вы правы в тестировании каждой библиотеки вызова, как fopen & fread, но при неудаче вы должны показывать с perror причину ошибки (или используйте strerror(errno)).

Ваш код

fprintf(fp, "%d\t%s\t%d\n", 
     list[i].code, list[i].station, list[i].price); 

не имеет никакого смысла. (Вы должны проверить, что результат этого fprintf равен 3, или perror). Вы печатаете текст в дескрипторе fp, открытом для двоичного чтения! Возможно, вы просто хотите printf здесь.

BTW, вызывая list переменную, которая на самом деле массив совершенно сбивает с толку ...

+0

Спасибо за ваш добрый ответ. также спасибо за все комментарии. Не могли бы вы объяснить, что такое {perror ("fread"); Выход (EXIT_FAILURE); }; Я никогда не видел perror также является EXIT_FAILURE функцией? Еще раз спасибо большое – user2813862

+0

Найдите время, чтобы прочитать хорошую книгу программирования C, а также, возможно, книгу системного программирования (на Linux, которая может быть http://advancedlinuxprogramming.com/ ...). У меня нет много часов, чтобы провести обучение C & системному программированию. Также скомпилируйте все предупреждения и информацию об отладке (например, с помощью 'gcc -Wall -g') и научитесь использовать отладчик (например,' gdb') –

+0

Спасибо, я использовал предоставленный вами код, но он все еще ничего не записывает в двоичный файл , ticket.bin все еще пуст. Спасибо за ваше время. и извините за плохое кодирование. – user2813862

0

Я думаю, что проблемы здесь:

(1)

... 
    //open a binary file to write. 
     fp = fopen("ticket.bin", "wb"); 
           | 
           v 
    ///...fopen("ticket.bin", "w"); /// 
    ... 

(2)

... 
    //write data into binary file. 
     if (fwrite(list, sizeof(list[0]), STATIONNUM, fp) != STATIONNUM); 
       | 
       v 
    ///...fwrite(&list,... /// 
    ... 

Следуйте этому примеру и попробуйте изменить свой код. по оферте:

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

#define STATIONNUM 10 //Maximun number of station. 

#define rate1 160 
#define rate2 190 
#define rate3 230 

struct Ticket 
{ 
    int code;//code of the list 
    char station[20];//destination name. 
    int price;//transportation fee. 
}; 

int main() 
{ FILE *fp; 
    int i; //use at for loop. 
    struct Ticket list[STATIONNUM] = 
    { 
    { 1, "NewYork  ", rate1 }, 
    { 2, "London  ", rate1 }, 
    { 3, "Paris  ", rate1 }, 
    { 4, "Tokyo  ", rate1 }, 
    { 5, "HongKong  ", rate2 }, 
    { 6, "Sydney  ", rate2 }, 
    { 7, "Milan  ", rate2 }, 
    { 8, "Berlin  ", rate2 }, 
    { 9, "Vancouver ", rate3 }, 
    { 10, "Afghanistan ", rate3 }, 
    }; 

    // open a binary file to write; write it; and close /// 
    if (!(fp = fopen("ticket.bin", "w"))) { printf("open file fail"); } 
    if (fwrite(&list, sizeof(list[0]), STATIONNUM, fp) != STATIONNUM); 
    if ((fclose(fp))==-1) { printf("File close failed.\n"); } 

    // 1-st 
    // open binary file to read; read; and close it /// 
    if (!(fp = fopen("ticket.bin", "r"))) { printf("open file fail"); } 
    fread(&list, sizeof(struct Ticket), STATIONNUM, fp); 
    if ((fclose(fp))==-1) { printf("File close failed.\n"); } 

    // Display initial information 
    for (i=0;i<STATIONNUM;i++) 
     { printf("%3d %s %d \n", list[i].code, list[i].station, list[i].price); } 
    getchar(); 

    // Change some thing :) /// 
    list[0].code = 20; strcpy(list[0].station, "MOSKOW  "); list[0].price = 200; 
    list[1].code = 30; strcpy(list[1].station, "MINSK  "); list[1].price = 250; 
    list[8].code = 60; strcpy(list[8].station, "ALMATY  "); list[8].price = 330; 
    list[9].code = 90; strcpy(list[9].station, "VLADIVOSTOK "); list[9].price = 530; 

    // open a binary file to write; write it; close the file /// 
    if (!(fp = fopen("ticket.bin", "w"))) { printf("open file fail"); } 
    if (fwrite(&list, sizeof(list[0]), STATIONNUM, fp) != STATIONNUM); 
    if ((fclose(fp))==-1) { printf("File close failed.\n"); } 

    // 2-nd 
    // open binary file to read; read; and close it /// 
    if (!(fp = fopen("ticket.bin", "r"))) { printf("open file fail"); } 
    fread(&list, sizeof(struct Ticket), STATIONNUM, fp); 
    if ((fclose(fp))==-1) { printf("File close failed.\n"); } 

    // Display new information again 
    for (i=0;i<STATIONNUM;i++) 
     { printf("%3d %s %d \n", list[i].code, list[i].station, list[i].price); } 
    getchar(); 
    return 0; 
} 

Удачи вам!

Смежные вопросы