Добавление информации в файл работает неправильно - 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();
    
}

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

  1. Включаемые заголовочные файлы:
    • stdafx.h
    • stdio.h
    • conio.h
    • stdlib.h
    • string.h
    • locale.h
  2. Определение переменных и констант:
    • FILENAME = input.txt
    • SIZE = 256
    • naz = 30-символьный массив для хранения названия
    • tip = 20-символьный массив для хранения типа
    • kol_vo, god, cena, deys = 4-байтные целочисленные переменные
    • password, pasw = 8-байтные целочисленные переменные
    • text = указатель на 1-байтовый блок памяти
    • buf = массив на 256 байтов для чтения из файла
  3. Основная функция программы:
    • main()
  4. Ввод пароля:
    • Считывание пароля с помощью scanf() в переменную password
    • Инициализация переменной pasw значением 123456789
    • Сравнение password и pasw
    • Вывод сообщения об ошибке, если пароли не совпадают
  5. Выбор действия:
    • Считывание выбора действия с помощью scanf() в переменную deys
    • Вывод возможных действий
    • В случае выбора действия 1 (просмотр), программа начинает читать файл и выводит каждую строку
    • В случае выбора действия 2 (добавление), программа открывает файл в режиме добавления и запрашивает название, тип, количество, год и цену, которые затем записываются в файл
    • В случае выбора действия 3 (удаление), программа удаляет файл
    • В случае выбора действия 4 (редактирование), программа открывает файл для редактирования и запрашивает название, тип, количество, год и цену, которые затем редактируются в файле
  6. Управление памятью:
    • Выделение памяти под переменную text с помощью calloc()
    • Реализация realloc() для увеличения размера памяти text при необходимости
    • Освобождение памяти под text с помощью free()
  7. Закрытие файла:
    • Использование функции fclose() для закрытия файла после завершения работы с ним
  8. Ввод/вывод данных:
    • Использование функций scanf() и printf() для ввода и вывода данных
    • Использование функции getch() для приостановки выполнения программы до нажатия клавиши
  9. Ошибки и обработка исключений:
    • Отсутствует обработка исключений и ошибок, кроме проверки пароля
  10. Связывание библиотечных функций:
    • Использование стандартных библиотек, таких как stdio.h, stdlib.h, string.h, locale.h

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


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

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

10   голосов , оценка 4.5 из 5