Лишние символы при записи в файл на Си
Суть проблемы такая, я записываю в файл данные, а потом с этого файла считываю. Считывается все как нужно, но вот в самом файле присутствую лишние символы. Пробовал очищать их перед использованием функцией memset(), но это не помогло.
Также проблема с методом MaxFalling, который не находит максимальной значения из условий. В переменную s записываются лишние символы, а не значение, при чем с течением итераций цикла переменная s не меняется, а условие ни разу не выполняется.
Исходные данные, которые я использовал Первые две колонки - это снижение содержимого золотого в г чистого золота за 1929 и 1957 год Последняя - это падение покупательной способности
Функция MaxFalling() реализует 1ое задание: Найти валюту падение покупательной способности которой максимально
Dollar |1,5 |0,89 |52,4
Funt |7,32 |2,49 |31,6
Frank |0,059|0,002 |3,4
Yena |0,75 |0,025 |0,76
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <clocale>
#include <cstdio>
#include <windows.h>
struct Economy {
char currName[20];
double reduction29;
double reduction57;
double falling;
}economy;
FILE* file;
int N = 0;
void FileInput();
void FileOutPut();
void Sort();
void MaxFalling();
void ReductionMoreThan_1();
int main()
{
system("chcp 1251");
setlocale(LC_ALL, "rus");
FILE* file;
int n = 0;
char buffer[255];
file = fopen("data.txt", "w+");
fclose(file);
FileInput();
FileOutPut();
MaxFalling();
/*ReductionMoreThan_1();
Sort();*/
}
void FileInput() {
char str[6], str1[6], str2[6];
int i = 0;
if ((file = fopen("data.txt", "w")) == NULL) {
printf("Ошибка открытия файла");
}
while (i < 4) {
printf("Валюта:");
gets_s(economy.currName);
if (strcmp(economy.currName, "") != 0) {
N++;
fwrite(economy.currName, sizeof(economy.currName), 1, file);
printf("Снижение в 1929:");
gets_s(str);
fwrite(str, sizeof(economy.reduction29) + 1, 1, file);
printf("Снижение в 1957:");
gets_s(str2);
fwrite(str2, sizeof(economy.reduction57) + 1, 1, file);
printf("Падение:");
gets_s(str1);
fwrite(str1, sizeof(economy.falling) + 1, 1, file);
fwrite("\n", sizeof(char), 1, file);
}
i++;
}
printf("Все данные записаны в файл data.txt\n");
fclose(file);
if ((file = fopen("data.txt", "r+")) == NULL) {
printf("Ошибка открытия файла");
}
}
void FileOutPut() {
int uk, i;
char str[6], str1[6], str2[6];
fseek(file, 0, SEEK_END);
uk = ftell(file);
i = 0;
while (i < uk) {
fseek(file, i, SEEK_SET);
fread(economy.currName, sizeof(economy.currName), 1, file);
fread(str, sizeof(economy.reduction29) + 1, 1, file);
fseek(file, ftell(file), SEEK_SET);
fread(str2, sizeof(economy.reduction57) + 1, 1, file);
fseek(file, ftell(file), SEEK_SET);
fread(str1, sizeof(economy.falling) + 1, 1, file);
printf("\n%s %s %s %s", economy.currName, str, str2, str1);
i += sizeof(economy) + 1;
}
fclose(file);
}
void MaxFalling() {
double max = 0;
int i = 0, uk;
char str[30], s[10];
fseek(file, 0, SEEK_END);
file = fopen("data.txt", "a+");
uk = ftell(file);
while (i < uk) {
fseek(file, i, SEEK_SET);
fread(economy.currName, sizeof(economy.falling), 1, file);
fread(s, sizeof(economy.falling), 1, file);
economy.falling = atof(s);
fseek(file, ftell(file) + 1, SEEK_SET);
fread(economy.currName, sizeof(economy.currName), 1, file);
if (economy.falling > max) {
max = economy.falling;
strcpy(str, economy.currName);
}
i += sizeof(economy) + 1;
}
printf("У %s наибольшее падение покупательной способности(%lf)", str, max);
}
void ReductionMoreThan_1() {
double max = 0;
int i = 0, uk;
char str[30], s[10];
fseek(file, 0, SEEK_END);
uk = ftell(file);
printf("Валюты с снижением в 1929 году больше 1.0:\n");
while (i < uk) {
fseek(file, i, SEEK_SET);
fread(economy.currName, sizeof(economy.reduction29), 1, file);
fread(s, sizeof(economy.reduction29), 1, file);
economy.reduction29 = atof(s);
fseek(file, ftell(file) + 1, SEEK_SET);
fread(economy.currName, sizeof(economy.currName), 1, file);
if (economy.reduction29 > 1.0) {
max = economy.reduction29;
strcpy(str, economy.currName);
printf("%s\n", str);
}
i += sizeof(economy) + 1;
}
}
void Sort() {
int i = 0, pos, j;
char s1[10], s[10];
struct Economy econom;
fseek(file, 0, SEEK_SET);
while (i < ((sizeof(economy) + 1) * (N - 1))) {
fseek(file, i, SEEK_SET);
fread(economy.currName, sizeof(economy.currName), 1, file);
fread(s, sizeof(economy.reduction57), 1, file);
fseek(file, ftell(file) + 1, SEEK_SET);
j = i + sizeof(economy) + 1;
while (j < ((sizeof(economy) + 1) * N)) {
fseek(file, j, SEEK_SET);
fread(econom.currName, sizeof(econom.currName), 1, file);
fread(s1, sizeof(econom.reduction57), 1, file);
fseek(file, ftell(file) + 1, SEEK_SET);
if ((atof(s) > 1 && atof(s1) > 1) && (s < s1)) {
pos = i;
fseek(file, pos, SEEK_SET);
fwrite(econom.currName, sizeof(econom.currName), 1, file);
fwrite(s1, sizeof(econom.reduction57) + 1, 1, file);
pos = j;
fseek(file, pos, SEEK_SET);
fwrite(economy.currName, sizeof(economy.currName), 1, file);
fwrite(s, sizeof(economy.reduction57) + 1, 1, file);
strcpy(s, s1);
strcpy(economy.currName, econom.currName);
}
j += sizeof(economy) + 1;
}
i += sizeof(economy) + 1;
}
}