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