Запись и чтение бинарных файлов - 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;
}
Объяснение кода листинга программы
- Задача программы - это запись и чтение бинарных файлов.
- Объявлены следующие переменные:
- pIn (указатель на файл)
- iFileSize (переменная для хранения размера файла)
- iItemsCnt (переменная для хранения количества элементов в файле)
- iValue (переменная для хранения значения элемента)
- pOut (указатель на файл)
- iPos (переменная для хранения позиции элемента)
- iChoice (переменная для выбора действия пользователем)
- Список функций:
- List() (вывод списка элементов файла)
- Add() (добавление элемента в файл)
- Find() (поиск элемента в файле)
- В функции main() происходит следующий процесс:
- Открытие файла с помощью функции fopen()
- Проверка корректности открытия файла
- Ввод выбора пользователя с помощью функции scanf()
- Определение выбранного действия с помощью оператора switch
- Выполнение выбранного действия
- Закрытие файла с помощью функции fclose()
- Номер 20 не используется.