Файловый ввод-вывод: текст записывается каракулями - 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
должны быть предварительно инициализированы. Значения этих переменных будут записаны в файл с указанием их размеров (в битах) и количеством элементов, которые необходимо записать.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д