Запись и чтение бинарных файлов - 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 не используется.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д