Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   [решено] Файловый ввод (http://forum.oszone.net/showthread.php?t=164056)

Lisiy_egik 20-01-2010 01:44 1324768

Файловый ввод
 
Доброго времени суток, прежде всего хочется отметить, что пример. который я приведу - экзаменационный вопрос, который мне совершенно не требуется решить, просто он в в какой-то степени удачно описывает мой вопрос о вводе.

Как обеспечить ввод и символьных переменных(буквы, пробелы и т.д.) и числовых так сказать. Трудно объяснить, к чему я и привел этот билет:

В файле операционной системы "Task4.in" хранится в текстовой форме ведомость сдачи экзаменов студентами некоторой группы. Каждая строка этого файла содержит сведения об одном студенте, представленные в следующем формате:
позиции 1...2 - порядковый номер студента в группе;
позиция 3 - пробельная литера;
позиции 4...22 - фамилия студента длиной не более 19 символов в произвольном месте поля;
позиция 23 - пробельная литера;
позиция 24 - четыре оценки по четырем предметам, разделенные не менее чем одной пробельной литерой.
Количество студентов в группе равно 16. Пример строк указанного файла:

01 Андреев 5 4 5 5
02 Быков 5 5 5 5
...
16 Яковлев 4 4 5 4

1.1. Написать объявление массива структур для хранения указанной ведомости.
1.2. Написать фрагмент программы, который заполнит экзаменационную ведомость данными, вводимыми из файла операционной системы "Task4.in". Ввод данных должен осуществляться в текстовом режиме средствами языка С или С++ по усмотрению экзаменуемого.
1.3. Написать фрагмент программы, который вычисляет среднюю экзаменационную оценку по всем предметам и студентам (т.е. среднюю оценку из 64 оценок), а затем выводит значение этого показателя в файл операционной системы "Task4.out".
Примечание.
Закрыть открытые файлы, как только они станут не нужны.
Предусмотреть контроль корректности значений, возвращаемых функциями библиотеки Си "fopen", "fscanf". Указать какие включаемые файлы требуeт представленный фрагмент.
Аналогичные действия предусмотреть и при использовании средств ввода-вывода языка С++.

мое решение (далеко не первое, просто предыдущих уже не осталось)

main
Код:

#include <iostream>
#include <fstream>
#include <cstdlib>
#include "rus8.h"
#include "student.h"
using namespace std;

int main(int argc, char *argv[])
{
        rus();

        if (argc < 3)
        {
                cout << "Ошибка 0 : введены не все аргументы командной строки" << endl;
                exit(0);
        }

        stud *arr = new stud[r];

        ifstream in(argv[1], ios::binary);

        read_list(in, arr);

        in.close();

        ofstream out(argv[2]);

        write_list(out, arr);

        out.close();

        return 0;
}

student.h
Код:

#include <iostream>
#include <fstream>
#include <cstdlib>
using namespace std;

const int n = 2;
const int size = 12;
const int m = 14;
const int r = 4;

struct stud
{
        int num[n];
        char name[size];
        int p1, p2, p3;
};

void read_list(istream &, stud *);

void write_list(ostream &, stud *);

rus8.h
Код:

#ifndef _RUS_H
    #define _RUS_H

    #include <locale.h>

    inline void rus( void )
    {   
        setlocale( LC_CTYPE, ".1251" );
        setlocale( LC_MONETARY, ".1251" );

        return;
    }

#endif

student.cpp
Код:

#include "student.h"

void read_list(istream &in, stud *arr)
{
        char temp[m];
        for(int i = 0; i < r; i++)
        {
                for(int p = 0; p<n; p++)
                {
                        in >> arr[i].num[p];
                }
                for(int z = 0; z<m; z++)
                        in >> temp[z];
                in >> arr[i].p1 >> arr[i].p2 >> arr[i].p3;
                for(int q = 0; q < size; q++)
                {
                        arr[i].name[q] = temp[q+1];
                }
        }
}

void write_list(ostream &out , stud *arr)
{
        for(int i = 0; i < r; i++)
        {
                for(int q = 0; q < n; q++)
                        out << arr[i].num[q];
                out << " ";
                for(int w = 0; w < size; w++)
                        out << arr[i].name[w];
                out << " " << arr[i].p1 << " " << arr[i].p2 << " " << arr[i].p3 << endl;
        }
}

в этом случае я решил попробовать решить эту проблему с помощью дополнительного массива символов и открытия файла в бинарном режиме, правда опять не помогло.

буду благодарен за ответ (если еще и пару строк кода, отвечающего за считывание будет - буду на седьмом небе от радости)) ), и совсем не обязательно чтоб он был привязан к этому примеру, просо хочу разобраться в принципе считывания.

Lisiy_egik 20-01-2010 05:40 1324829

Код:

#include <string>
Код:

struct stud
{
        int num;
        string name;
        int p1, p2, p3;
};

Код:

void read_list(istream &in, stud *arr)
{
        for(int i = 0; i < r; i++)
        {
                in >> arr[i].num >> arr[i].name;
                in >> arr[i].p1 >> arr[i].p2 >> arr[i].p3;
        }
}

на все надо смотреть проще... либо чаще отдыхать)

решил


Время: 19:02.

Время: 19:02.
© OSzone.net 2001-