Файловый ввод-вывод: текст записывается каракулями - 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);//ввод

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

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

  1. fwrite(&mm[n].namen ,sizeof(char), sizeof(mm[n].namen),fp); Записывает в файл значение переменной namen типа char.
  2. fwrite(&mm[n].namec ,sizeof(char), sizeof(mm[n].nameс),fp); Записывает в файл значение переменной namec типа char.
  3. fwrite(&mm[n].number ,sizeof(int),1,fp); Записывает в файл значение переменной number типа int. Переменные namen, namec и number должны быть предварительно инициализированы. Значения этих переменных будут записаны в файл с указанием их размеров (в битах) и количеством элементов, которые необходимо записать.

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


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

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

10   голосов , оценка 4.1 из 5
Похожие ответы