Добавление информации в файл работает неправильно - C (СИ)
Формулировка задачи:
добрый день, такая проблема возникла: если я добавляю информацию в файл и потом ее удаляю в самом файле, то следующая строка записывается не на место удаленной строки и на следующую. прошу помощи как исправить? и еще 1 вопрос почему записывает иероглифы а не русские буквы?писал setlocal(L_ALL,"Russian")
Решение задачи: «Добавление информации в файл работает неправильно»
textual
Листинг программы
#include "stdafx.h"
#include <stdio.h>
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <locale.h>
#define FILENAME "input.txt"
#define SIZE 256
char naz[30];
char tip[20];
int kol_vo;
int god;
int cena;
int deys;
long int password;
long int pasw;
int main(void)
{
setlocale(LC_ALL,"Russian");
printf("Введите пароль: ");
scanf("%ld",&password);
pasw = 123456789;
if(password!=pasw){
printf("Неверный пароль");
getch();
return 1;}
else
printf("Выберите действие:\n");
printf("(1)Просмотр\n");
printf("(2)Добавление\n");
printf("(3)Удаление\n");
printf("(4)Редактирование\n");
scanf("%d",&deys);
char buf[SIZE] = { 0 }, *text = NULL;
FILE* file = fopen("c:\\Users\\Alexandr\\Desktop\\input.txt", "rt");
size_t i = 0;
text = (char*)calloc(1, sizeof(char));
switch(deys){
case(1):{
while (fgets(buf, SIZE, file) != NULL)
{
if (i % 2 == 0)
text = (char*)realloc(text, SIZE * (i + 2));
strcat(text, buf);
++i;
}
printf("Название\tТип\tКол-во\tГод\tЦена\n");
printf("%s", text);
fclose(file);
getch();
break;}
case (2) :
file = fopen("c:\\Users\\Alexandr\\Desktop\\input.txt", "a");
printf("Название: \n");
scanf("%s",&naz);
fprintf(file,"\n%s\t",naz);
printf("Тип: \n");
scanf("%s",&tip);
fprintf(file,"\t%s",tip);
printf("Кол-во: \n");
scanf("%d",&kol_vo);
fprintf(file,"\t\t%d",kol_vo);
printf("Год: \n");
scanf("%d",&god);
fprintf(file,"\t%d",god);
printf("Цена: \n");
scanf("%d",&cena);
fprintf(file,"\t%d",cena);
fclose(file);
free(text);
getch();
}
Объяснение кода листинга программы
- Включаемые заголовочные файлы:
- stdafx.h
- stdio.h
- conio.h
- stdlib.h
- string.h
- locale.h
- Определение переменных и констант:
- FILENAME =
input.txt - SIZE = 256
- naz = 30-символьный массив для хранения названия
- tip = 20-символьный массив для хранения типа
- kol_vo, god, cena, deys = 4-байтные целочисленные переменные
- password, pasw = 8-байтные целочисленные переменные
- text = указатель на 1-байтовый блок памяти
- buf = массив на 256 байтов для чтения из файла
- FILENAME =
- Основная функция программы:
- main()
- Ввод пароля:
- Считывание пароля с помощью scanf() в переменную password
- Инициализация переменной pasw значением 123456789
- Сравнение password и pasw
- Вывод сообщения об ошибке, если пароли не совпадают
- Выбор действия:
- Считывание выбора действия с помощью scanf() в переменную deys
- Вывод возможных действий
- В случае выбора действия 1 (просмотр), программа начинает читать файл и выводит каждую строку
- В случае выбора действия 2 (добавление), программа открывает файл в режиме добавления и запрашивает название, тип, количество, год и цену, которые затем записываются в файл
- В случае выбора действия 3 (удаление), программа удаляет файл
- В случае выбора действия 4 (редактирование), программа открывает файл для редактирования и запрашивает название, тип, количество, год и цену, которые затем редактируются в файле
- Управление памятью:
- Выделение памяти под переменную text с помощью calloc()
- Реализация realloc() для увеличения размера памяти text при необходимости
- Освобождение памяти под text с помощью free()
- Закрытие файла:
- Использование функции fclose() для закрытия файла после завершения работы с ним
- Ввод/вывод данных:
- Использование функций scanf() и printf() для ввода и вывода данных
- Использование функции getch() для приостановки выполнения программы до нажатия клавиши
- Ошибки и обработка исключений:
- Отсутствует обработка исключений и ошибок, кроме проверки пароля
- Связывание библиотечных функций:
- Использование стандартных библиотек, таких как stdio.h, stdlib.h, string.h, locale.h