Запись числа в файл - C (СИ)

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

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

Не могу понять где ошибка. Есть структура "Государство", создаю файл, добавляю информацию - при выводе нормальным остаётся только название страны, в остальных колонках получаются непонятные цифры. Подскажите, что здесь не так. Желательно на Си
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <conio.h>
#include <io.h>
#include <string.h>
#include <stdlib.h>
#include <windows.h>
int  Total = 0;
char FileName[100];
char *OpenFileMsg = "\n Для работы необходимо создать файл (пункт 1)\n";
struct GOROD
{
    char Gor[20];       
    char Stol[20];
    int pl;
    int adr;
    int  Chisl;
};
struct GOROD Mas[500];
int Save();
int menu()  
{
    int q;
    printf("================\n===== МЕНЮ =====\n================");
    printf("\n1: Создать файл");
    printf("\n2: Добавить информацию о стране");
    printf("\n3: Удалить информацию о стране");
    printf("\n4: Изменить");
    printf("\n5: Список");
    printf("\n6: Сортировка по стране\n");
    scanf_s("%d", &q);
    return q;
}
 
void Edit(int Num)
{
    printf("\nНазвание страны: \n");
    scanf("%s", &Mas[Num].Gor[20]);
    printf("Столица: \n");
    scanf("%s", &Mas[Num].Stol[20]);
    printf("Численность: \n");
    scanf("%d", &Mas[Num].Chisl);
    printf("Площадь: \n");
    scanf("%d", &Mas[Num].pl);
    printf("Адрес: \n");
    scanf("%d", &Mas[Num].adr);
}
 
int Add()  
{
    Edit(Total);
    Total++;
    if (Save())
    {
        return 1;
    }
    else
    {
        Total--;
        printf("\n\n");
        return 0;
    }
}
int Save()
{
    FILE *out;
    int i;
    if ((out = fopen(FileName, "w+t")) == NULL)
    {
        return 0;
    }
    fseek(out, 0, 0);
    for (i = 0; i<Total; i++)
    {
        fprintf(out, "\n%s;\n", &Mas[i].Gor[20]);
        fprintf(out, "%s;\n", &Mas[i].Stol[20]);
        fprintf(out, "%d;\n", &Mas[i].Chisl);
        fprintf(out, "%d;\n", &Mas[i].pl);
        fprintf(out, "%d;\n", &Mas[i].adr);
        if (i != Total - 1)
        {
            fprintf(out, "\n");
        }
    }
    fclose(out);
    return 1;
}
 
void List()
{
    int i;
    for (i = 0; i<Total; i++)
    {
        printf("%s\n", &Mas[i].Gor[20]);
        printf("%s\n", &Mas[i].Stol[20]);
        printf("%d\n", &Mas[i].Chisl);
        printf("%d\n", &Mas[i].pl);
        printf("%d\n", &Mas[i].adr);
        printf("\n");
        
    }
}
 
void CreateNewFile()
{
    FILE *NewFile;
    printf("Введите название файла\n");
    char s[100];
    scanf("%s", &s);
    if ((NewFile = fopen(s, "w+t")) == NULL)
    {
        printf("\n");
        _getch();
    }
    else
    {
        fclose(NewFile);
        Total = 0;
        strcpy(FileName, s);
        printf("Новый файл успешно создан.\n");
    }
}
 
int main()
{
    int c=0, n;
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    while (1)
    {
        switch (menu())
        {
        case 2:
        {
            if (strcmp(FileName, "") == NULL)
            {
                printf(OpenFileMsg);
            }
            else
            {
                Add();
            }
        }
        break;
 
        case 4:
        {
            if (strcmp(FileName, "") == NULL)
            {
                printf(OpenFileMsg);
            }
            else
            {
                printf("Укажите номер города: ");
                scanf("%d", &n);
                Edit(n);
            }
        }
        break;
        case 5:
        {
            if (strcmp(FileName, "") == NULL)
            {
                printf(OpenFileMsg);
            }
            else
            {
                List();
            }
        }
        break;
        case 1:
        {
            CreateNewFile();
        }
        break;
        }
    } 
}

Решение задачи: «Запись числа в файл»

textual
Листинг программы
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
 
int  Total = 0;
char FileName[100];
char* OpenFileMsg = "\n Для работы необходимо создать файл (пункт 1)\n";
struct GOROD {
    char Gor[20];
    char Stol[20];
    int pl;
    int adr;
    int  Chisl;
};
struct GOROD Mas[500];
int Save();
int menu() {
    int q;
    printf("================\n===== МЕНЮ =====\n================");
    printf("\n1: Создать файл");
    printf("\n2: Добавить информацию о стране");
    printf("\n3: Удалить информацию о стране");
    printf("\n4: Изменить");
    printf("\n5: Список");
    printf("\n6: Сортировка по стране\n");
    scanf("%d", &q);
    return q;
}
 
void Edit(int Num) {
    printf("\nНазвание страны: \n");
    scanf("%s", Mas[Num].Gor);
    printf("Столица: \n");
    scanf("%s", Mas[Num].Stol);
    printf("Численность: \n");
    scanf("%d", &Mas[Num].Chisl);
    printf("Площадь: \n");
    scanf("%d", &Mas[Num].pl);
    printf("Адрес: \n");
    scanf("%d", &Mas[Num].adr);
}
 
int Add() {
    Edit(Total);
    Total++;
    if (Save()) {
        return 1;
    } else {
        Total--;
        printf("\n\n");
        return 0;
    }
}
int Save() {
    FILE* out;
    int i;
    if ((out = fopen(FileName, "w+t")) == NULL) {
        return 0;
    }
    fseek(out, 0, 0);
    for (i = 0; i < Total; i++) {
        fprintf(out, "\n%s;\n", Mas[i].Gor);
        fprintf(out, "%s;\n", Mas[i].Stol);
        fprintf(out, "%d;\n", Mas[i].Chisl);
        fprintf(out, "%d;\n", Mas[i].pl);
        fprintf(out, "%d;\n", Mas[i].adr);
        if (i != Total - 1) {
            fprintf(out, "\n");
        }
    }
    fclose(out);
    return 1;
}
 
void List() {
    int i;
    for (i = 0; i < Total; i++) {
        printf("%s\n", Mas[i].Gor);
        printf("%s\n", Mas[i].Stol);
        printf("%d\n", Mas[i].Chisl);
        printf("%d\n", Mas[i].pl);
        printf("%d\n",  Mas[i].adr);
        printf("\n");
 
    }
}
 
void CreateNewFile() {
    FILE* NewFile;
    printf("Введите название файла\n");
    char s[100];
    scanf("%s", s);
    if ((NewFile = fopen(s, "w+t")) == NULL) {
        printf("\n");
        getchar();
    } else {
        fclose(NewFile);
        Total = 0;
        strcpy(FileName, s);
        printf("Новый файл успешно создан.\n");
    }
}
 
int main() {
    int n;
    //SetConsoleCP(1251);
    //SetConsoleOutputCP(1251);
    while (1) {
        switch (menu()) {
            case 2: {
                    if (strcmp(FileName, "") == 0) {
                        puts(OpenFileMsg);
                    } else {
                        Add();
                    }
                }
                break;
 
            case 4: {
                    if (strcmp(FileName, "") == 0) {
                        puts(OpenFileMsg);
                    } else {
                        printf("Укажите номер города: ");
                        scanf("%d", &n);
                        Edit(n);
                    }
                }
                break;
            case 5: {
                    if (strcmp(FileName, "") == 0) {
                        puts(OpenFileMsg);
                    } else {
                        List();
                    }
                }
                break;
            case 1: {
                    CreateNewFile();
                }
                break;
        }
    }
}

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

В данном коде происходит запись информации о странах в файл.

  1. Объявлены переменные:
    • Total - счетчик количества добавленных стран;
    • FileName - строка для хранения имени файла;
    • OpenFileMsg - строка с сообщением о необходимости создания файла;
    • GOROD - структура, содержащая информацию о стране (название, столица, численность населения, площадь и адрес);
    • Mas - массив структур GOROD;
    • menu() - функция, реализующая меню программы;
    • Edit(int Num) - функция, позволяющая редактировать информацию о стране;
    • Add() - функция, добавляющая информацию о стране в файл;
    • Save() - функция, сохраняющая информацию о странах в файл;
    • List() - функция, выводящая список стран из файла;
    • CreateNewFile() - функция, создающая новый файл;
    • main() - основная функция программы.
  2. В функции main() в цикле while(1) происходит выбор действия из меню с помощью функции menu().
  3. При выборе действия 2 происходит добавление информации о стране в файл. Если файл пуст, выводится сообщение об необходимости его создания.
  4. При выборе действия 4 происходит редактирование информации о стране. Если файл пуст, выводится сообщение об открытии файла.
  5. При выборе действия 5 происходит вывод списка стран из файла. Если файл пуст, выводится сообщение об открытии файла.
  6. При выборе действия 1 происходит создание нового файла.

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


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

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

8   голосов , оценка 3.75 из 5