Файловый ввод-вывод: текст записывается каракулями - C (СИ)
Формулировка задачи:
Вообщем такая тема.
Есть программа, которая должна брать данные из файла и выводить их на экран, а потом после вывода можно выполнить поиск по данным(например задать какое-то значение, чтобы что-то вывелось).Если задаешь в поиск неверное значение, то программа должна записать в существующий файл ошибку.
Из файла считывает инфу и выводит её на экран, в этом моменте всё норм.А вот в моменте где надо записать в файл информацию, то он мне записывает в файл какой-то бред в виде .
В чём ошибка?
Вот код:
#include<stdio.h>
#include<string.h>
#include <locale.h>
#include<errno.h>
struct marsh
{
char namen[20];//начало пункта
char namec[20];//конец пункта
int number;//номер маршрута
char p[20];//пункт для сравнения
int flagp;
}
mm[3];//размерность массива
int main(void)
{
setlocale(LC_ALL, "rus");
FILE *fpw;
char cc[256];
int errno;
FILE *fp;
fp=fopen("structures.txt","r");
struct marsh mm[3];//объявление структуры
struct marsh x;//переменные структуры
int n,m;
int i,j;
if ((fp=fopen("structures.txt","r"))==NULL)
{
printf("%s", strerror(errno));
exit(0);
}
for(n=0;n<3;n++)//цикл,3-размерность массива
{
printf("%d. Vvedite: nazvanie nachalnogo punkta, konechnogo punkta, nomer marshruta>",n+1);//вывод
fscanf(fp,"%s",&mm[n].namen);//ввод
fscanf(fp,"%s",&mm[n].namec);//ввод
fscanf(fp,"%d",&mm[n].number);//ввод
}
printf("----------------------------------------------\n");//вывод(рисование таблицы)
printf("| Marshruti |\n");//вывод
printf("|-----------------|-----------------|---------|\n");//вывод(рисование таблицы)
printf("|Nazvanie |Nazvanie |Nomer |\n");//вывод
printf("|nachalnogo punkta|konechnogo punkta|marshruta|\n");//вывод
printf("|-----------------|-----------------|---------|\n");//вывод
for(i=0;i<n;i++)
{
printf("| %15s | %15s | %7d |\n", mm[i].namen, mm[i].namec, mm[i].number);//ввод данных
}
printf("----------------------------------------------\n");//рисование таблицы
for(i=0;i<n-1;i++)//отсортировка по номеру маршрута
{
m=i;
for(j=i+1;j<n;j++)
{
if(mm[m].number>mm[j].number)//строка больше чем столбец
{
m=j;
}
}
if(m>i)
{
x=mm[i];
mm[i]=mm[m];
mm[m]=x;
}
}
//отсортировка записанного в таблицу
printf("----------------------------------------------\n");//рисование таблицы
printf("| Marshruti |\n");//вывод
printf("|-----------------|-----------------|---------|\n");//рисование таблицы
printf("|Nazvanie |Nazvanie |Nomer |\n");//вывод
printf("|nachalnogo punkta|konechnogo punkta|marshruta|\n");//вывод
printf("|-----------------|-----------------|---------|\n");//рисование таблицы
for(i=0;i<n;i++)
{
printf("| %15s | %15s | %7d |\n", mm[i].namen, mm[i].namec, mm[i].number);
}
printf("-----------------------------------------------\n");
printf("Vvedite naselenniy punkt>");
char p[20];//сверивается введеные значения с табличными(ввыводится информация о маршруте,если совпадает введеное значение с началом и с концом)
scanf("%s", &p);//вывод строки
int flagp=0;
for(i=0;i<3;i++)
{//сравнение начального пункта с конечным
if(strncmp(p,mm[i].namen,sizeof(p))==0)
{
printf("%s\n%s\n%d\n",mm[i].namen,mm[i].namec,mm[i].number);
flagp=1;
}
else if (strncmp(p,mm[i].namec,sizeof(p))==0)
{
printf("%s\n%s\n%d\n",mm[i].namen,mm[i].namec,mm[i].number);
flagp=1;
}
}
if(flagp==0)//совпадает
{
printf("Net takogo punkta");
}
fpw=fopen("trash.txt","w");
for(n=0;n<3;n++)
{
fwrite(&mm[n].namen ,sizeof(char),fp);//ввод
fwrite(&mm[n].namec ,sizeof(char),fp);//ввод
fwrite(&mm[n].number ,sizeof(int),fp);//ввод
}
return 0;
}Решение задачи: «Файловый ввод-вывод: текст записывается каракулями»
textual
Листинг программы
fwrite(&mm[n].namen ,sizeof(char), sizeof(mm[n].namen),fp);//ввод fwrite(&mm[n].namec ,sizeof(char), sizeof(mm[n].nameс),fp);//ввод fwrite(&mm[n].number ,sizeof(int),1,fp);//ввод
Объяснение кода листинга программы
В данном коде выполняется запись данных в файл.
fwrite(&mm[n].namen ,sizeof(char), sizeof(mm[n].namen),fp);Записывает в файл значение переменнойnamenтипаchar.fwrite(&mm[n].namec ,sizeof(char), sizeof(mm[n].nameс),fp);Записывает в файл значение переменнойnamecтипаchar.fwrite(&mm[n].number ,sizeof(int),1,fp);Записывает в файл значение переменнойnumberтипаint. Переменныеnamen,namecиnumberдолжны быть предварительно инициализированы. Значения этих переменных будут записаны в файл с указанием их размеров (в битах) и количеством элементов, которые необходимо записать.