2013-12-17 2 views
-1

Я пытаюсь реализовать систему сохранения, которая позволяет мне сохранять введенные пользователем данные структуры пакета, которые пользователь вводил в оператор switch. Каждая введенная запись сохраняется в одном файле, разделенном по строкам в виде обычного текста. Он также должен указать пользователю, что они хотели бы назвать файл, тогда программа должна указать, сколько записей было сохранено в файле, наконец, если имя не было введено для файла сохранения, оно должно вернуться в главное меню.Сохранение структуры данных в текстовый файл

как вы можете видеть из функции сохранения пустоты внизу, я попытался реализовать эту систему сохранения, но когда я запускаю программу и выбираю S, чтобы сохранить записи в файл, она просто сбрасывает программу после ввода имя для имени файла. Поэтому, если бы кто-нибудь мог мне помочь в этом, это было бы здорово.

struct packet{ 
    int source; 
    int destination; 
    int type;    // Varibles for the structure 
    int port; 
    char data[50]; 
    char * filename; 
}; 

void save(int, struct packet*); //function to save the records stored to a file 
int main() 
{ 
struct packet s[50];   //Array for structure input 
char choice; 
int NetworkPacket = 0, ii = 0; 
int recordCount = 0; 
struct packet *records; 
struct packet *temp; 
records = malloc(sizeof(struct packet)); 

саз для выбора, чтобы сохранить файл

case 'S': 
      system("cls"); //clear the screen 
      save(NetworkPacket, records); //S was chosen so use the Save function 
break; 

функция сохранения

void save(int rCount, struct packet *records){ 
    FILE *recordFile;     //file handle 
    char fileName[30] = { '\0'};  //string to store the file name 
    int i; 

    puts("Enter a filename to save the records :"); //ask the user for the filename 
    scanf("%s", fileName);       //store the filename: data input should be checked 
                //here in your program 

    //try and open the file for writing and react accordingly if there is a problem 
    if((recordFile = fopen(fileName,"w"))==NULL){ 
     printf("Couldn't open the file: %s\n",fileName); 
     exit(1); 
    } 
    else{ //the file opened so print the records array of packets to it 
     for(i=0;i<rCount;i++){ 
      fprintf(recordFile,"%04d %04d %04d %04d %s\n", 
        records[i].source, 
        records[i].destination, 
        records[i].type, 
        records[i].port, 
        records[i].port, 
        records[i].data); 
     } 
     fclose(recordFile); //close the file 
    } 

} 
+0

Построить a de ошибка, и запустить в отладчике. Он остановится в месте аварии и позволит вам изучить и подобрать стек вызовов функций. Когда вы поднимаете стек вызовов до места, в вашем коде происходит сбой, вы сможете изучить значения переменных. –

+0

Вещи, которые нужно искать до этого, могут быть значением 'rCount' (' NetworkPacket') и убедиться, что у вас достаточно выделенной памяти для указателя 'records' (прямо сейчас вы, кажется, выделяете только одну структуру пакета). –

+0

Вы уверены, что записи [i] .data - строка с нулевым завершением? –

ответ

0

Существует еще один% d модификатор требуется в строке формата - есть пять Интса, но только 4% ds

fprintf(recordFile,"%04d %04d %04d %04d %04d %s\n", 
             ^^^^ 
Смежные вопросы