1

Тема: запис у текстовий файл інформації

Написати програму, яка буде додавати у текстовий файл введену з клавіатури інформацію (згідно варіанту). Слід передбачити можливість вибору користувачем режиму роботи: додавання чи відображення даних. Забезпечити зберігання даних у файлі у вигляді структурованої таблиці, для цього слід використовувати засоби форматування.
Ось власне код:

#include <stdlib.h>
#include <fstream>
#include <iostream>
#include <string>
#include <iomanip>

using namespace std;
int main ()
{
int rik,i;
string kompaniya;
char n[128],m;
cout<<"vvedit' komandu(w or r)"<<endl;
cin>>m;
if(m=='w'){
cout<<"Nazva kompanii = "<<endl;
cin>>kompaniya;
cout<<"Rik zasnyvanya = "<<endl;
cin>>rik;
ofstream ofile("Test.txt",ios::out);
if(!ofile){
cout<<"file not open"<<endl;
}
ofile<<" Nazva kompanii    Rik Zasnyvanya "
<<endl<<setw(20)<<kompaniya<<setw(20)<<rik<<"\n";
ofile.close();    
}
else if(m=='r'){
ifstream ifile("Test.txt",ios::in);
if(!ifile){
cout<<"file not open"<<endl;
}
for( i=0;i<3;i++){
ifile>>n;
cout<<n<<"        ";
}
cout<<endl;
for( i=0;i<3;i++){
ifile>>n;
cout<<n<<"               ";
}
cout<<endl;
}
else if((m!='w') && (m!='r'))
cout<<"fattal error"<<endl;
return 0;
}

Проблема в тому:
1. В програмі при запуску у користувача дається запит читати файл чи записати в нього мені потрібно добавити ще третій варіант вийти з програми при натисканні певної клавіші.
2.Коли я наприклад прочитав або записав в файл програма закривається а потрібно щоб була можливість повернути до меню вибору!
3.Третє власне питання у форматуванні: коли я вводжу наприклад назву компанії дуже довга то при натисканні ентер для запису року програма просто ігнорує і пропускає рік. І ще одне мені потрібно наприклад щоб під назвою компанії була *назва компанії* а під роком *рік* а то воно все зійшло, щоб неправильно зробив з форматуванням. Допоможіть кому не важко!!!Ось скріншот самого виводу

Post's attachments

nio.JPG 11.63 kb, 312 downloads since 2013-03-02 

2

Re: запис у текстовий файл інформації

По порядку:

Питання №1

В програмі при запуску у користувача дається запит читати файл чи записати в нього мені потрібно добавити ще третій варіант вийти з програми при натисканні певної клавіші.

Робите вічний цикл з виходом по команді 'q'. Варіант зі swtich буде наступним (якщо на if'ах - булева змінна непотрібна):

Код
int main()
{
//...
bool do_loop = true;
while(do_loop)
{
    scanf("%c", &m);
    switch(m)
    {
        case 'w':
            fnInputAndSave();
            break;
        case 'r':
            showRecords();
            break;
        case 'q':
            do_loop = false;
            break;
    }
}

return 0;
}

Питання №2

Коли я наприклад прочитав або записав в файл програма закривається а потрібно щоб була можливість повернути до меню вибору!

Відповідь

Див. відповідь на Питання №1.


Питання №3

Третє власне питання у форматуванні: коли я вводжу наприклад назву компанії дуже довга то при натисканні ентер для запису року програма просто ігнорує і пропускає рік. І ще одне мені потрібно наприклад щоб під назвою компанії була *назва компанії* а під роком *рік* а то воно все зійшло, щоб неправильно зробив з форматуванням. Допоможіть кому не важко!!!Ось скріншот самого виводу

Граблі лежать у cin: він автоматично припиняє зчитування до змінної, як тільки натикається на білий символ (пробіл, спуск вниз, табуляцію тощо).
Як варіант - scanf():

char name[1024]={0};
int year;
scanf("%s#%d", name, &year);

Має зчитати правильно, якщо ввести

Моя крута компанія#2013

3

Re: запис у текстовий файл інформації

Скажіть, будь ласка, призначення типу bool.

4

Re: запис у текстовий файл інформації

Eldar написав:

Скажіть, будь ласка, призначення типу bool.

У цій задачі булева змінна є умовою зупинки/продовження циклу.

5

Re: запис у текстовий файл інформації

Ваша версія не працює.

6

Re: запис у текстовий файл інформації

Eldar написав:

Ваша версія не працює.

Та, не пройшов фокус, бачу.
Але підійде інший варіант - поміняти місцями поля, які вводяться.

scanf("%d#%s", &year, name);

7

Re: запис у текстовий файл інформації

Подібний код!
Але не можу розібратись з виводом, допоможіть, щоб виводило як табличку

#include <stdlib.h>
#include <fstream>
#include <iostream>
#include <string>
#include <iomanip>
using namespace std;

int main( )
{
    bool p;
    cout<<endl<<"Enter '1' for rewiev or '0' for add "<<endl;
    cin>>p;
    if ( p==true ) 
        {
            string n;
            int i;
            ifstream file("E:\\file.txt",ios::in);
            if(!file)
            {
                cout<<"file not open"<<endl;
            }
            for( i=0;i<3;i++)
            {
                file>>n;
                cout<<n<<" ";
            }
            cout<<endl;
            for( i=0;i<2;i++)
            {
                file>>n;
                cout<<n<<" ";
            }
            cout<<endl;
                    
        }
    else 
        {
            string name,date;
            cout<<"Name "<<endl;
            cin>>name;
            cout<<"B-day is "<<endl;
            cin>>date;
            ofstream file("E:\\file.txt",ios::app);
            if(!file){
            cout<<"file not open"<<endl;
            }
            file<<" Name                 B-Day is "<<endl<<name<<setw(30)<<date<<"\n";
            file.close();

        
        }
return 0;
}

Там з операторами відступу напевне треба, чи можливо в мене цикли виводу не правильні!

8

Re: запис у текстовий файл інформації

Anddep, завтра ввечері гляну по вашому коду.

9

Re: запис у текстовий файл інформації

Прихований текст
#include <stdlib.h>
#include <fstream>
#include <iostream>
#include <string>
#include <iomanip>
using namespace std;

int main( )
{

    int n;

    cout<<endl<<"Enter '1' for rewiev or '0' for add or '3' for begin again"<<endl;

    while (true)
    {
        cin>>n;



        if ( n==1 ) 
        {
            const int max=50;
            char str[max];
            ifstream file("E:\\file.txt",ios::in);
        
            cout.width(5);
            cout << "Name and date\n"<<endl;
        
            while(!file.eof())
            {
    
                    file.getline(str,max);
                
                if (!file.eof())
                {
                    
                    cout << str<<endl;
                }
                
            }
            

            file.close();

        }


        if ( n==0 )

        {
            string name,date;
            cout<<"Name"<<endl;
            cin>>name;
            cout<<"B-day"<<endl;
            cin>>date;
            ofstream file("E:\\file.txt",ios::app);
            if(!file){
                cout<<"file not open"<<endl;
            }
            file<<setiosflags(ios::left)<<setw(15)<<name<<setw(30)<<date<<"\n";
            file.close();


        }

        if ( n==3 )
            break;
        cout<<endl<<"Enter '1' for rewiev or '0' for add or '3' for begin again"<<endl;

    }

    return 0;
}

Розібрався, трохи!
Кому потрібно, ловіть!

Подякували: sardar22222

10

Re: запис у текстовий файл інформації

Прогресуєте. :)
Флаги потоків - то уже результат. :)

11

Re: запис у текстовий файл інформації

Думаю, що краще буде якщо буде можливість дописувати дані у файл:)

Код
#include <stdlib.h>
#include <fstream>
#include <iostream>
#include <iomanip>
char ch;
using namespace std;
int main ()
{
    int year, i;
    char name[10000], com;
    ofstream fout;
    fout.open("Company catalog.txt",ios::app);
    if(!fout)
    {
        cout << "Error(File not open)" << endl;
    }
    fout << "Name of company | Year of foundation" << endl;
    fout.close();
    
    bool flag = true;
    while (flag)
    {
        cout << "Input comand 'w' for write, 'r' for read or 'q' for exit" << endl;
        scanf("%c", &com);
        switch(com)
        {
            case 'w':
            {
                cout << "Year of foundation and Name of company:\n";
                cin >> year;
                cin >> name;
                ofstream fout;
                fout.open("Company catalog.txt",ios::app);
                if(!fout)
                {
                    cout << "Error(File not open)" << endl;
                }
                fout << name;
                fout << setw(16) << year << "\n";
                fout.close();
            }
            break;
            case 'r':
            {
                ifstream fin;
                fin.open("Company catalog.txt",ios::in);
                if(!fin)
                {
                    cout << "Error(File not open)" << endl;
                }
                while(fin.get(ch))
                {
                    cout << ch;
                }        
                fin.close();
            }
            break;
            case 'q':
                flag = false;
            break;
        }
    }
    return 0;
}

12

Re: запис у текстовий файл інформації

if(!fin)
                {
                    cout << "Error(File not open)" << endl;
                }
                while(fin.get(ch))
                {
                    cout << ch;
                }

Коректна перевірка відкриття файлу - fin.is_open().
І ще варто припиняти роботу з файлом, якщо тут він не відкрився, а так виходить, що ми просто кажемо користувачеві, що файлу нема, і.. починаємо намагатися читати з нього. Програма не впаде, але логіка порушиться, бо такі граблі можуть виявитися фатальними у більших проектах.

З.І: а умова (!fin), думаю, ніколи не виконається, бо fin - об'єкт, а не покажчик. Відповідно адреса реального об'єкта - завше ненульова. ;)

13

Re: запис у текстовий файл інформації

Anddep написав:
Прихований текст
#include <stdlib.h>
#include <fstream>
#include <iostream>
#include <string>
#include <iomanip>
using namespace std;

int main( )
{

    int n;

    cout<<endl<<"Enter '1' for rewiev or '0' for add or '3' for begin again"<<endl;

    while (true)
    {
        cin>>n;



        if ( n==1 ) 
        {
            const int max=50;
            char str[max];
            ifstream file("E:\\file.txt",ios::in);
        
            cout.width(5);
            cout << "Name and date\n"<<endl;
        
            while(!file.eof())
            {
    
                    file.getline(str,max);
                
                if (!file.eof())
                {
                    
                    cout << str<<endl;
                }
                
            }
            

            file.close();

        }


        if ( n==0 )

        {
            string name,date;
            cout<<"Name"<<endl;
            cin>>name;
            cout<<"B-day"<<endl;
            cin>>date;
            ofstream file("E:\\file.txt",ios::app);
            if(!file){
                cout<<"file not open"<<endl;
            }
            file<<setiosflags(ios::left)<<setw(15)<<name<<setw(30)<<date<<"\n";
            file.close();


        }

        if ( n==3 )
            break;
        cout<<endl<<"Enter '1' for rewiev or '0' for add or '3' for begin again"<<endl;

    }

    return 0;
}

Розібрався, трохи!
Кому потрібно, ловіть!

В мене подібне задання але з клавіатури вводиться прізвище та номер телефону, я взяв цей код і зробив під себе, і трішки заблукав