Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [C++ Builder] Файловые функции, работа с послед. файлами. 
:(
    Опции темы
Tsunameh
Дата 18.5.2007, 16:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 29.4.2007

Репутация: нет
Всего: нет



Доброго времени суток! )
Возникла задачка :

Дан фаил вещественных чисел с именем Name1. Создать 2 новых файла с именами Name2 и Name3 , первый из которых содержит элементы исходного файла с четными номерами (0,2,4) , а второй - с нечетными (1,3,5). 

Огромная просьба написать код в наиболее простом для пурвокурсника виде и объяснить принцип действия , а то я вообще в этом никак не шарюшу )
PM MAIL   Вверх
Anikmar
Дата 18.5.2007, 17:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 59



Можно так:
Код

//---------------------------------------------------------------------------
#include <stdio.h>
#pragma hdrstop

//---------------------------------------------------------------------------

#pragma argsused
int main(int argc, char* argv[])
{
    FILE *InputFile,*ChetFile,*NechetFile;
    float Num;
    bool IsChet = true;

    // Открываем исходный файл
    InputFile = fopen("input.txt","r");
    if (InputFile == NULL)
    {
        printf("Error open file input.txt\n");
        goto ExitProc;
    }

    // Открываем выходной файл для четных позиций
    ChetFile = fopen("chet.txt","w+");
    if (ChetFile == NULL)
    {
        printf("Error open file chet.txt\n");
        goto ExitProc1;
    }

    // Открываем выходной файл для нечетных позиций
    NechetFile = fopen("nechet.txt","w+");
    if (NechetFile == NULL)
    {
        printf("Error open file nechet.txt");
        goto ExitProc2;
    }

    // Пока есть числа в исходном файле
    while (!feof(InputFile))
    {
        // Считываем из исходного файла очередное число
        fscanf(InputFile,"%f",&Num);
        // Если текущая позиция четная - записываем в четный файл,
        // иначе - записываем в нечетный
        if (IsChet) fprintf(ChetFile,"%f\n",Num);
        else fprintf(NechetFile,"%f\n",Num);
        // Инвертируем позицию - был чет стал нечет и наоборот
        IsChet = !IsChet;
    }

    // Закрываем файлы
    fclose(InputFile);
ExitProc2:
    fclose(ChetFile);
ExitProc1:
    fclose(InputFile);
ExitProc:
    return 0;
}


Если не нравятся goto - городите скобки или закрывайте файлы и выходите сразу, лично я много скобок не люблю.
PM MAIL ICQ   Вверх
Rockie
Дата 18.5.2007, 17:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 23.4.2006

Репутация: 13
Всего: 31



Код

#include <fstream>
#include <iostream>

using namespace std;

int main()
{
    ifstream f_in("Name1.txt");

    // проверка, успешно ли открылся файл
    if(!f_in) {cout<<"No file"; return 1;}

    ofstream f_out1("Name2.txt");
    // тут аналогично
    ofstream f_out2("Name3.txt");
    // ..

    int buf;
    while(f_in>>buf)
    {
        if(buf%2==0) f_out1<<buf<<' ';
        else f_out2<<buf<<' ';
    }

    return 0;
}





--------------------
Чтобы иметь большой гардероб - надо иметь большой гардероб.
PM   Вверх
Anikmar
Дата 18.5.2007, 17:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 59



Rockie, там не элементы чет нечет, а номера элементов
И я так понял не целые числа, а вещественные.
PM MAIL ICQ   Вверх
Tsunameh
Дата 18.5.2007, 18:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 29.4.2007

Репутация: нет
Всего: нет



спасибо , буду разбираться )
PM MAIL   Вверх
Rockie
Дата 18.5.2007, 21:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 23.4.2006

Репутация: 13
Всего: 31



Anikmar, эт ты внимательно прочитал. Тогда к примеру так:
Код

    double buf;
    while(!f_in.eof())
    {
        f_in>>buf;  f_out1<<buf<<' ';
        f_in>>buf;  f_out2<<buf<<' ';
    }






--------------------
Чтобы иметь большой гардероб - надо иметь большой гардероб.
PM   Вверх
Anikmar
Дата 18.5.2007, 22:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 59



Rockie, Эх, не хочу вас разочаровывать - но опять не прокатит. Почему вы уверены, что элементов всегда четное количество? Если их будет нечетное количество в результирующий файл бкудет записан лишний 0, который отсутствует в исходном.
PM MAIL ICQ   Вверх
Xenon
Дата 19.5.2007, 17:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1529
Регистрация: 12.4.2006

Репутация: 19
Всего: 50



Anikmar, у Rockie, просто не там проверяется конец файла. Вот так правильно по всем параметрам (только проверка на успешность создания/открытия файлов я в одно место согнал).
Код

#include <iostream>
#include <fstream>

int main(int argc, char* argv[])
{
    std::ifstream in_file("Name1.txt"); //Исходный файл
    std::ofstream even_out("Name2.txt"); //Четные позиции
    std::ofstream odd_out("Name3.txt"); //Нечетные позиции
    if ( !(in_file.is_open() && even_out.is_open() && even_out.is_open() ) ) //Если хотя бы один из файлов не открылся ...
    {
        std::cout << "Could not open file";
        std::cin.get();
        return -1;
    }
    while (true)
    {
        double buf = 0.0;
        in_file >> buf; //Считаем в буфер первое число в цикле
        if ( in_file.eof() ) break; //Если вдруг нарвемся на конце файла - выходим (заодно и исключается запись 0, про которую говорил Anikmar
        even_out << buf << ' '; //Первое считанное в цикле число всегда будет четным, ибо начинаем с 0
        in_file >> buf; //Считаем в буфер второе число в цикле
        odd_out << buf << ' '; //Второе считанное в цикле число всегда будет нечетным
    }
    std::cin.sync();
    std::cin.get();
    return 0;
}


Да, забыл, если у нас старподобный борланд, то скорее всего так будет:
Код

#include <iostream.h>
#include <fstream.h>

int main(int argc, char* argv[])
{
    ifstream in_file("Name1.txt");
    ofstream even_out("Name2.txt");
    ofstream odd_out("Name3.txt");
    if ( !(in_file.is_open() && even_out.is_open() && even_out.is_open() ) )
    {
        cout << "Could not open file";
        cin.get();
        return -1;
    }
    while (true)
    {
        double buf = 0.0;
        in_file >> buf;
        if ( in_file.eof() ) break;
        even_out << buf << ' ';
        in_file >> buf;
        odd_out << buf << ' ';
    }
    cin.sync();
    cin.get();
    return 0;
}


Это сообщение отредактировал(а) Xenon - 19.5.2007, 17:12


--------------------
user posted image  
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0474 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.