Запись и чтение бинарных файлов - C (СИ) (150371)

Узнай цену своей работы

Формулировка задачи:

Помогите пожалуйста с написанием программы.Нужно сделать запись и чтение из бинарный файла для типа данных long. Прилагаю код. ввод в бинарный работает но почему-то не хочет останавливаться когда надо. а вывод не работает.Выводит совершенно другие цифры а на те что были введены.Помогите пожалуйста что где не так
#include <stdio.h> 
#include <conio.h> 
#include <stdlib.h> 
 
#define ERROR_OPEN_FILE -3 
#define SIZE 10 
 
void main(int argc, char *argv[]) { 
 FILE *iofile = NULL; 
 unsigned long counter; 
 int i, num; 
 int pos; 
 int value = 0; 
 
 int menu; 
 int yn; 
 printf("1.List\n2.Add\n3.Find\n4.Exit\n"); 
 printf("Selection: "); 
 scanf("%d",&menu); 
 if (menu==1){ 
 iofile = fopen("numbers.bin", "rb"); 
 if (iofile == NULL) { 
 printf("Error opening file"); 
 getch(); 
 exit(ERROR_OPEN_FILE); 
 } 
 
 for (i = 0; i < SIZE; i++) { 
 fread(&value, sizeof(long), 1, iofile); 
 printf("%d ", value); 
 } 
 fclose(iofile); 
 getch(); 
} 
 else if(menu==2){ 
iofile = fopen("numbers.bin", "wb"); 
 if (iofile == NULL) { 
 printf("Error opening file"); 
 getch(); 
 exit(ERROR_OPEN_FILE); 
 } 
 fwrite(&counter, sizeof(long), 1, iofile); 
 do { 
 printf("Enter position [0..9] "); 
 scanf("%d", &pos); 
 if (pos < 0 || pos >= SIZE) { 
 break; 
 } 
 printf("Enter value "); 
 scanf("%d", &value); 
 fseek(iofile, pos*sizeof(long), SEEK_SET); 
 fwrite(&value, sizeof(long), 1, iofile); 
 rewind(iofile); 
 } while(1); 
 
 fclose(iofile); 
 getch(); 
} 
}

Решение задачи: «Запись и чтение бинарных файлов»

textual
Листинг программы
#include "stdafx.h"
 
#include<stdio.h>
 
#define MAX_NUM            (10)
#define DATA_FILE          "numbers.bin"
 
static void List()
{
   FILE*    pIn = fopen(DATA_FILE,"rb");
 
   int   iFileSize = 0;
   int   iItemsCnt = 0;
   int   iValue    = 0;
 
   if (!pIn)
   {
      printf("File [%s] open error!\n",DATA_FILE);
      return;
   }
      
   // Get File size
   if (fseek(pIn,0,SEEK_END))
   {
      // Error !
      printf("File [%s] seek error!\n",DATA_FILE);
      fclose(pIn);
      return;
   }
 
   iFileSize = ftell(pIn);
 
   if (!iFileSize)
   {
      printf("File [%s] open error!\n",DATA_FILE);
      return;
   }
 
   iItemsCnt = iFileSize / sizeof(int); 
 
   rewind(pIn);
 
   for (int ii = 0; ii < iItemsCnt; ++ii) 
   {
      if (fread(&iValue,sizeof(int),1,pIn) != 1)
      {
         printf("File [%s] read error!\n",DATA_FILE);
         fclose(pIn);
         return;
      }
 
      printf("Pos: %d, Value %d\n",ii + 1,iValue);
   }
 
   fclose(pIn);
}
 
static void Add()
{
   while (true)
   {
      int   iPos   = 0;
      int   iValue = 0;
 
      printf("Enter value position [0..9] or any other value to stop input:  ");
   
      scanf("%d",&iPos);
 
      if ((iPos < 0) || (iPos >= MAX_NUM)) 
      {
         // Error !
         printf("Invalid position [%d]\n",iPos);
         return;
      }
 
      printf("Enter value:  ");
 
      scanf("%d",&iValue);
 
      FILE*    pOut = fopen(DATA_FILE,"r+b");
 
      if (!pOut)
      {
         printf("File [%s] open error!\n",DATA_FILE);
         return;
      }
 
      if (fseek(pOut,iPos * sizeof(int),SEEK_SET))
      {
         // Error !
         printf("File [%s] seek error!\n",DATA_FILE);
         fclose(pOut);
         return;
      }
 
      if (fwrite(&iValue,sizeof(int),1,pOut) != 1)
      {
         // Error !
         printf("File [%s] write error!\n",DATA_FILE);
         fclose(pOut);
         return;
      }
 
      fclose(pOut);
   }
}
 
static void Find()
{
   // Haven't yet implemented !
}
 
int main(int argc,char** argv)
{
   // Be sure file exist before any operations with it.
   FILE*    pFile = fopen(DATA_FILE,"a");
 
   if (!pFile)
   {
      // Error !
      printf("File [%s] can;t be open for operation!\n",DATA_FILE);
      fclose(pFile);
      return 0;
   }
 
   fclose(pFile);
 
   int   iChoice;
 
   while (true)
   {
      printf("\nDo your selection:\n1 - List,  2 - Add,  3 - Find,  0 - Exit\n");
 
      scanf("%d",&iChoice);
 
      switch (iChoice)
      {
         case 1:
         {
            List();
            break;
         }
         case 2:
         {
            Add();
            break;
         }
         case 3:
         {
            Find();
            break;
         }
         case 0:
         {
            exit(0);
            break;
         }
         default :
         {
            // Continue Loop
            break;
         }
      }
   }
 
   return 0;
}

Объяснение кода листинга программы

  1. Задача программы - это запись и чтение бинарных файлов.
  2. Объявлены следующие переменные:
    • pIn (указатель на файл)
    • iFileSize (переменная для хранения размера файла)
    • iItemsCnt (переменная для хранения количества элементов в файле)
    • iValue (переменная для хранения значения элемента)
    • pOut (указатель на файл)
    • iPos (переменная для хранения позиции элемента)
    • iChoice (переменная для выбора действия пользователем)
  3. Список функций:
    • List() (вывод списка элементов файла)
    • Add() (добавление элемента в файл)
    • Find() (поиск элемента в файле)
  4. В функции main() происходит следующий процесс:
    • Открытие файла с помощью функции fopen()
    • Проверка корректности открытия файла
    • Ввод выбора пользователя с помощью функции scanf()
    • Определение выбранного действия с помощью оператора switch
    • Выполнение выбранного действия
    • Закрытие файла с помощью функции fclose()
  5. Номер 20 не используется.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 3.875 из 5
Похожие ответы