Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.11.2015, 23:23   #1
Max00766
Форумчанин
 
Регистрация: 15.11.2015
Сообщений: 151
По умолчанию Работа с файлами - C

Заданы файлы f1, f2, f3, f4, f5, компонентами которых являются действительные числа. Организовать обмен компонентов между файлами в соответствии со схемой:
f1->f2,
f2->f3,
f3->f4,
f4->f5,
f5->f1.
Разрешается использовать один промежуточный файл h.
Помогите исправить код.
Код:
#include <stdio.h>
main()
{
    float ch1[10], ch2[10], ch3[10], ch4[10], ch5[10];
    int n, i;
    printf("Vvedite n:\n");
    scanf("%i", &n);
    FILE *f1;
    f1=fopen("g:\\prog13\\f1.txt", "w");
    printf("Vvedite chisla\n");
    for(i=0;i<n;i++)
    {
        scanf("%f", &ch1[i]);
    }
    for(i=0;i<n;i++)
    fprintf(f1, "%8.3f", ch1[i]);
    fclose(f1);
    FILE *f2;
    f2=fopen("g:\\prog13\\f2.txt", "w");
    printf("\nVvedite chisla\n");
    for(i=0;i<n;i++)
    {
        scanf("%f", &ch2[i]);
    }
    for(i=0;i<n;i++)
    fprintf(f2, "%8.3f", ch2[i]);
    fclose(f2);
    FILE *f3;
    f3=fopen("g:\\prog13\\f3.txt", "w");
    printf("\nVvedite chisla\n");
    for(i=0;i<n;i++)
    {
        scanf("%f", &ch3[i]);
    }
    for(i=0;i<n;i++)
    fprintf(f3, "%8.3f", ch3[i]);
    fclose(f3);
    FILE *f4;
    f4=fopen("g:\\prog13\\f4.txt", "w");
    printf("\nVvedite chisla\n");
    for(i=0;i<n;i++)
    {
        scanf("%f", &ch4[i]);
    }
    for(i=0;i<n;i++)
    fprintf(f4, "%8.3f", ch4[i]);
    fclose(f4);
    FILE *f5;
    f5=fopen("g:\\prog13\\f5.txt", "w");
    printf("\nVvedite chisla\n");
    for(i=0;i<n;i++)
    {
        scanf("%f", &ch5[i]);
    }
    for(i=0;i<n;i++)
    fprintf(f5, "%8.3f", ch5[i]);
    fclose(f5);
    FILE *h;
    h=fopen("g:\\prog13\\h.txt", "w");
    f1=fopen("g:\\prog13\\h.txt", "r");
    for(i=0;i<n;i++)
    {
        while (fread(&ch1[i], sizeof(float), 1, f1)!=0)
        {
            fwrite(&ch1[i], sizeof(float), 1, h);
        }
}
    fclose(f1);
    fclose(h);
}
Max00766 вне форума Ответить с цитированием
Старый 23.11.2015, 00:44   #2
Базиля
Участник клуба
 
Аватар для Базиля
 
Регистрация: 03.12.2009
Сообщений: 1,013
По умолчанию

Цитата:
h=fopen("g:\\prog13\\h.txt", "w");
f1=fopen("g:\\prog13\\h.txt", "r");
Это во первых.

Во вторых.
Код:
 for(i=0;i<n;i++)
    {
        while (fread(&ch1[i], sizeof(float), 1, f1)!=0)
        {
            fwrite(&ch1[i], sizeof(float), 1, h);
        }
}
Вы считываете 4 байта из файла (в вашем случае 4 кода символов по кодовой таблице ASCII) и интерпретируете эту последовательность как число типа float.
Если я введу в файл строку "1234" и попытаюсь ее считать по вашему принципу, то вот что выйдет из этого (как пример):
Код:
	
float f = 0;
char *s  = (char*) &f;

s[0] = '1';
s[1] = '2';
s[2] = '3';
s[3] = '4';
Не забываем про формат представления вещественных чисел в памяти!

Также, обратите внимание на запись в файл:
Код:
fprintf(f1, "%8.3f", ch1[i]);
Если задаете формат вывода в файл, то придерживайтесь его и в случае считывания. Но это замечание вам в большей степени на будущее. Так как судя по всему, вы о нем забыли

Последний раз редактировалось Базиля; 23.11.2015 в 00:59.
Базиля вне форума Ответить с цитированием
Старый 23.11.2015, 01:06   #3
Max00766
Форумчанин
 
Регистрация: 15.11.2015
Сообщений: 151
По умолчанию

Цитата:
Сообщение от Базиля Посмотреть сообщение
Это во первых.

Во вторых.
Код:
 for(i=0;i<n;i++)
    {
        while (fread(&ch1[i], sizeof(float), 1, f1)!=0)
        {
            fwrite(&ch1[i], sizeof(float), 1, h);
        }
}
Вы считываете 4 байта из файла (в вашем случае 4 кода символов по кодовой таблице ASCII) и интерпретируете эту последовательность как число типа float.
Если я введу в файл строку "1234" и попытаюсь ее считать по вашему принципу, то вот что выйдет из этого (как пример):
Код:
	
float f = 0;
char *s  = (char*) &f;

s[0] = '1';
s[1] = '2';
s[2] = '3';
s[3] = '4';
Не забываем про формат представления вещественных чисел в памяти!

Также, обратите внимание на запись в файл:
Код:
fprintf(f1, "%8.3f", ch1[i]);
Если задаете формат вывода в файл, то придерживайтесь его и в случае считывания. Но это замечание вам в большей степени на будущее. Так как судя по всему, вы о нем забыли
Не поможете прикрутить к моему коду, а то что-то я уже туплю и башка не варит?)
Max00766 вне форума Ответить с цитированием
Старый 23.11.2015, 09:40   #4
Max00766
Форумчанин
 
Регистрация: 15.11.2015
Сообщений: 151
По умолчанию

Все ще актуально, не получается исправить код
Max00766 вне форума Ответить с цитированием
Старый 23.11.2015, 23:42   #5
Max00766
Форумчанин
 
Регистрация: 15.11.2015
Сообщений: 151
По умолчанию

Актуально, нужна помощь!
Max00766 вне форума Ответить с цитированием
Старый 23.11.2015, 23:58   #6
Базиля
Участник клуба
 
Аватар для Базиля
 
Регистрация: 03.12.2009
Сообщений: 1,013
По умолчанию

А на чем застряли?
Давайте договоримся, что буду ждать от вас конкретных вопросов.
Так интересней
Базиля вне форума Ответить с цитированием
Старый 24.11.2015, 00:21   #7
Max00766
Форумчанин
 
Регистрация: 15.11.2015
Сообщений: 151
По умолчанию

Цитата:
Сообщение от Базиля Посмотреть сообщение
А на чем застряли?
Давайте договоримся, что буду ждать от вас конкретных вопросов.
Так интересней
Застрял на том же, не могу заставить обменивать данные в файлах, не могу прикрутить это к моему коду
Max00766 вне форума Ответить с цитированием
Старый 24.11.2015, 00:32   #8
Max00766
Форумчанин
 
Регистрация: 15.11.2015
Сообщений: 151
По умолчанию

Файлы числами заполняются, но не пойму как обмен делать:
Код:
#include <stdio.h>
main()
{
    float ch1[10], ch2[10], ch3[10], ch4[10], ch5[10];
    int n, i;
    printf("Vvedite n:\n");
    scanf("%i", &n);
    FILE *f1;
    f1=fopen("c:\\prog13\\f1.txt", "w");
    printf("Vvedite chisla\n");
    for(i=0;i<n;i++)
 {
        scanf("%f", &ch1[i]);
 }
    for(i=0;i<n;i++)
    fprintf(f1, "%8.3f", ch1[i]);
    fclose(f1);
    FILE *f2;
    f2=fopen("c:\\prog13\\f2.txt", "w");
    printf("\nVvedite chisla\n");
    for(i=0;i<n;i++)
 {
        scanf("%f", &ch2[i]);
 }
    for(i=0;i<n;i++)
    fprintf(f2, "%8.3f", ch2[i]);
    fclose(f2);
    FILE *f3;
    f3=fopen("c:\\prog13\\f3.txt", "w");
    printf("\nVvedite chisla\n");
    for(i=0;i<n;i++)
 {
        scanf("%f", &ch3[i]);
 }
    for(i=0;i<n;i++)
    fprintf(f3, "%8.3f", ch3[i]);
    fclose(f3);
    FILE *f4;
    f4=fopen("c:\\prog13\\f4.txt", "w");
    printf("\nVvedite chisla\n");
    for(i=0;i<n;i++)
 {
        scanf("%f", &ch4[i]);
 }
    for(i=0;i<n;i++)
    fprintf(f4, "%8.3f", ch4[i]);
    fclose(f4);
    FILE *f5;
    f5=fopen("c:\\prog13\\f5.txt", "w");
    printf("\nVvedite chisla\n");
    for(i=0;i<n;i++)
 {
        scanf("%f", &ch5[i]);
 } 
    for(i=0;i<n;i++)
    fprintf(f5, "%8.3f", ch5[i]);
    fclose(f5);
    FILE *h;
    h=fopen("c:\\prog13\\h.txt", "w");
    f1=fopen("c:\\prog13\\h.txt", "r");
    for(i=0;i<n;i++)
 {
        while (fread(&ch1[i], sizeof(float), 1, f1)!=0)
  {
            fwrite(&ch1[i], sizeof(float), 1, h);
  }
 }
fclose(f1);
fclose(h);
}
Max00766 вне форума Ответить с цитированием
Старый 24.11.2015, 13:42   #9
Max00766
Форумчанин
 
Регистрация: 15.11.2015
Сообщений: 151
По умолчанию

Сделал такой обмен между файлами, но теперь не выполняется запись чисел, программа закрывается после ввода n. В файле f1 записывает большое число, в файлах f2 и h - нули. Что не так в коде?
Код:
#include <stdio.h>
main()
{
    float ch1[10], ch2[10], ch3[10], ch4[10], ch5[10];
    int n, i;
    printf("Vvedite n:\n");
    scanf("%i", &n);
    FILE *f1;
    FILE *h;
    h=fopen("c:\\laba13\\h.txt", "w");
    f1=fopen("c:\\laba13\\f1.txt", "r");
    printf("Zapolnite file\n");
    while (fscanf(f1, "%f", &ch1[i]))
 {
        for(i=0;i<n;i++)
        fprintf(h, "%8.3f", ch1[i]);
        break;
 }
    fclose(f1);
    fclose(h);
    FILE *f2;
    f1=fopen("c:\\laba13\\f1.txt", "w+");
    f2=fopen("c:\\laba13\\f2.txt", "r");
    while (fscanf(f2, "%f", &ch2[i]))
 {
        for(i=0;i<n;i++)
        fprintf(f1, "%8.3f", ch2[i]);
        break;
 }
    fclose(f1);
    fclose(f2);
    f2=fopen("c:\\laba13\\f2.txt", "w+");
    h=fopen("c:\\laba13\\h.txt", "r");
    while (fscanf(h, "%f", &ch1[i]))
 {
        for(i=0;i<n;i++)
        fprintf(f2, "%8.3f", ch1[i]);
        break;
 }
    fclose(f2);
    fclose(h);
 
}
Max00766 вне форума Ответить с цитированием
Старый 24.11.2015, 14:33   #10
Max00766
Форумчанин
 
Регистрация: 15.11.2015
Сообщений: 151
По умолчанию

Получилось сделать обмен, только работает не совсем корректно, а именно записывает в таком порядке:
f1->f5,
f2->
f3->f2,
f4->f3,
f5->f4,f1
Код обмена:
Код:
    h=fopen("c:\\laba13\\h.txt", "w");
    f1=fopen("c:\\laba13\\f1.txt", "r");
    while (fscanf(f1, "%f", &ch1[i]))
    {
        for(i=0;i<n;i++)
        fprintf(h, "%8.3f", ch1[i]);
        break;
    }
    fclose(f1);
    fclose(h);
    f1=fopen("c:\\laba13\\f1.txt", "w+");
    f2=fopen("c:\\laba13\\f2.txt", "r");
    while (fscanf(f2, "%f", &ch2[i]))
    {
        for(i=0;i<n;i++)
        fprintf(f1, "%8.3f", ch2[i]);
        break;
    }
    fclose(f1);
    fclose(f2);
    f2=fopen("c:\\laba13\\f2.txt", "w+");
    h=fopen("c:\\laba13\\h.txt", "r");
    while (fscanf(h, "%f", &ch1[i]))
    {
        for(i=0;i<n;i++)
        fprintf(f2, "%8.3f", ch1[i]);
        break;
    }
    fclose(f2);
    fclose(h);
    //=====================================
    h=fopen("c:\\laba13\\h.txt", "w");
    f2=fopen("c:\\laba13\\f2.txt", "r");
    while (fscanf(f2, "%f", &ch2[i]))
    {
        for(i=0;i<n;i++)
        fprintf(h, "%8.3f", ch2[i]);
        break;
    }
    fclose(f2);
    fclose(h);
    f2=fopen("c:\\laba13\\f2.txt", "w+");
    f3=fopen("c:\\laba13\\f3.txt", "r");
    while (fscanf(f3, "%f", &ch3[i]))
    {
        for(i=0;i<n;i++)
        fprintf(f2, "%8.3f", ch3[i]);
        break;
    }
    fclose(f2);
    fclose(f3);
    f3=fopen("c:\\laba13\\f3.txt", "w+");
    h=fopen("c:\\laba13\\h.txt", "r");
    while (fscanf(h, "%f", &ch2[i]))
    {
        for(i=0;i<n;i++)
        fprintf(f3, "%8.3f", ch2[i]);
        break;
    }
    fclose(f3);
    fclose(h);
    //=====================================
    h=fopen("c:\\laba13\\h.txt", "w");
    f3=fopen("c:\\laba13\\f3.txt", "r");
    while (fscanf(f3, "%f", &ch3[i]))
    {
        for(i=0;i<n;i++)
        fprintf(h, "%8.3f", ch3[i]);
        break;
    }
    fclose(f3);
    fclose(h);
    f3=fopen("c:\\laba13\\f3.txt", "w+");
    f4=fopen("c:\\laba13\\f4.txt", "r");
    while (fscanf(f4, "%f", &ch4[i]))
    {
        for(i=0;i<n;i++)
        fprintf(f3, "%8.3f", ch4[i]);
        break;
    }
    fclose(f3);
    fclose(f4);
    f4=fopen("c:\\laba13\\f4.txt", "w+");
    h=fopen("c:\\laba13\\h.txt", "r");
    while (fscanf(h, "%f", &ch3[i]))
    {
        for(i=0;i<n;i++)
        fprintf(f4, "%8.3f", ch3[i]);
        break;
    }
    fclose(f4);
    fclose(h);
    //=====================================
    h=fopen("c:\\laba13\\h.txt", "w");
    f4=fopen("c:\\laba13\\f4.txt", "r");
    while (fscanf(f4, "%f", &ch4[i]))
    {
        for(i=0;i<n;i++)
        fprintf(h, "%8.3f", ch4[i]);
        break;
    }
    fclose(f4);
    fclose(h);
    f4=fopen("c:\\laba13\\f4.txt", "w+");
    f5=fopen("c:\\laba13\\f5.txt", "r");
    while (fscanf(f5, "%f", &ch5[i]))
    {
        for(i=0;i<n;i++)
        fprintf(f4, "%8.3f", ch5[i]);
        break;
    }
    fclose(f4);
    fclose(f5);
    f5=fopen("c:\\laba13\\f5.txt", "w+");
    h=fopen("c:\\laba13\\h.txt", "r");
    while (fscanf(h, "%f", &ch4[i]))
    {
        for(i=0;i<n;i++)
        fprintf(f5, "%8.3f", ch4[i]);
        break;
    }
    fclose(f5);
    fclose(h);
    //=====================================
    h=fopen("c:\\laba13\\h.txt", "w");
    f5=fopen("c:\\laba13\\f5.txt", "r");
    while (fscanf(f5, "%f", &ch5[i]))
    {
        for(i=0;i<n;i++)
        fprintf(h, "%8.3f", ch5[i]);
        break;
    }
    fclose(f5);
    fclose(h);
    f5=fopen("c:\\laba13\\f5.txt", "w+");
    f1=fopen("c:\\laba13\\f1.txt", "r");
    while (fscanf(f1, "%f", &ch1[i]))
    {
        for(i=0;i<n;i++)
        fprintf(f5, "%8.3f", ch1[i]);
        break;
    }
    fclose(f5);
    fclose(f1);
    f1=fopen("c:\\laba13\\f1.txt", "w+");
    h=fopen("c:\\laba13\\h.txt", "r");
    while (fscanf(h, "%f", &ch5[i]))
    {
        for(i=0;i<n;i++)
        fprintf(f1, "%8.3f", ch5[i]);
        break;
    }
    fclose(f1);
    fclose(h);

}
Max00766 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с файлами: запись, добавление, чтение (найти ошибку в коде) / C для начинающих Надо создать программу для работы с файлами Konlor Общие вопросы C/C++ 2 18.05.2014 12:37
Работа с файлами Kazik Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 18.05.2010 11:12
Работа с файлами в С серг Общие вопросы C/C++ 9 18.02.2010 19:21
работа с файлами vakyla Помощь студентам 15 08.11.2009 13:05