1 Востаннє редагувалося Faraon (29.05.2015 21:42:35)

Тема: Зчитування рядків з файла визначеної довжини (c++)

Привіт всім. Переді мною стоїть задача...

Одним із можливих способів збереження “довгого” тексту – це розділити його на частини
(рядки) однакової довжини і зберігати його як масив вказівників на ці рядки. Утворити тип
для зберігання тексту вказаним способом.
Нехай у текстовому файлі задано ціле число і текст. Число – вказує якої довжини
повинні бути рядки. Використовуючи розроблений тип, ввести текст. Видрукувати його у
вигляді рядків вказаної довжини.
Поміняти місцями парні та непарні рядки. Видрукувати.

Я написав клас в якому ми будем зберігати текст:
SaveText.h

#ifndef SAVETEXT_H
#define SAVETEXT_H
#include <iostream>
#include <string>
using namespace std;

class SaveText
{
private:
    char * text;
public:
    SaveText();
    SaveText(char * _text);
    void setSaveText(char * _text);
    char getSaveText()const;
    char show()const;
};

#endif

SaveText.cpp

#include "SaveText.h"
#include <iostream>
#include <string>
using namespace std;

    SaveText::SaveText()
    {
            text = "no text";     
    };
    SaveText::SaveText(char * _text)
    {
        text = _text;
    };
    void SaveText::setSaveText(char * _text)
    {
        text = _text;
    };
    char SaveText::getSaveText()const
    {
        return * text;
    };
    char SaveText::show()const
    {
        cout<<text;
    };

main.cpp

//тут має бути реалізовано процес зберігання
#include <iostream>
#include <string>
#include <fstream>
using namespace std;

void main()
{

    SaveText ** mas = new SaveText * [];
    ifstream s;
    s.open("Text.txt", ios_base::in);

    //int i = 0, n  = 0;
    //s>>n;

    //while(!s.eof())
    //{
    //    char c;


    //    s>>c;


    //    i++;
    //}

    cin.get();
    cin.get();
};

а ось як сам процес зберігання тексту  написати з урахуваннями пробілів я незнаю...
Допоможіть будь ласка :)

2 Востаннє редагувалося Faraon (29.05.2015 23:12:22)

Re: Зчитування рядків з файла визначеної довжини (c++)

Думав що спрацює так:
main.cpp

//Варіант 1.
//1. Одним із можливих способів збереження “довгого” тексту – це розділити його на частини 
//(рядки) однакової довжини і зберігати його як масив вказівників на ці рядки. Утворити тип 
//для зберігання тексту вказаним способом. 
//Нехай у текстовому файлі задано ціле число і текст. Число – вказує якої довжини 
//повинні бути рядки. Використовуючи розроблений тип, ввести текст. Видрукувати його у 
//вигляді рядків вказаної довжини. 
//Поміняти місцями парні та непарні рядки. Видрукувати.

#include "SaveText.h"
#include <iostream>
#include <string>
#include <fstream>
using namespace std;

void main()
{
    SaveText ** mas =new SaveText*[];

    ifstream file; //створили об'єкт
    file.open("Text.txt");//відкрили файл для читання

    int i = 0, n  = 0;
    file>>n;

    while(!file.eof())
    {
        file[color=red].[/color]getline(mas, n); // зчитується рядок довжиною в n символів
        i++;
    }
    file.close();
    cin.get();
    cin.get();
};

але чомусь підкреслює крапку... як це виправити?
http://fs65.www.ex.ua/show/461473962628/168916604/168916604.jpg?800

3 Востаннє редагувалося Faraon (29.05.2015 23:20:15)

Re: Зчитування рядків з файла визначеної довжини (c++)

напевне коректніше буде так написати:

    while(!file.eof())
    {
        file.getline(mas[i], n); // зчитується рядок довжиною в n символів
        i++;
    }

але помилка залишилася та сама

4 Востаннє редагувалося Faraon (30.05.2015 00:46:54)

Re: Зчитування рядків з файла визначеної довжини (c++)

зрозумів що помилка стається через записування в змінну mas:

SaveText ** mas =new SaveText *[];

тому вирішив спочатку записати текст по 10 символів в простий масив

        int i = 0, n  = 0;
        char * c;
        file>>n;
        
        while(!file.eof())
        {
            file.getline(c, n); // зчитується рядок довжиною в n символів
            cout<<c;
            i++;
        }

весь код main.cpp:

//Варіант 1.
//1. Одним із можливих способів збереження “довгого” тексту – це розділити його на частини 
//(рядки) однакової довжини і зберігати його як масив вказівників на ці рядки. Утворити тип 
//для зберігання тексту вказаним способом. 
//Нехай у текстовому файлі задано ціле число і текст. Число – вказує якої довжини 
//повинні бути рядки. Використовуючи розроблений тип, ввести текст. Видрукувати його у 
//вигляді рядків вказаної довжини. 
//Поміняти місцями парні та непарні рядки. Видрукувати.

#include "SaveText.h"
#include <iostream>
#include <string>
#include <fstream>
using namespace std;

void main()
{
    setlocale(LC_ALL, "rus"); // корректне відображення кирилиці
    SaveText ** mas =new SaveText*[];
    ifstream file; //створили об'єкт
    file.open("Text.txt", ios_base::in);//відкрили файл для читання

    if (!file.is_open()) // якщо файл не відкритий то повертає 1 якщо відкритий то 0
        cout << "Файл не може бути відкритий!\n";
    else
    {
        int i = 0, n  = 0;
        char * c;
        file>>n;
        
        while(!file.eof())
        {
            file.getline(c, n); // зчитується рядок довжиною в n символів
            cout<<c;
            i++;
        }

    }

    file.close();
    cin.get();
    cin.get();
};

начебто все ок... але при компіляції вискакує віконечко
http://fs66.www.ex.ua/show/630512030584/168926863/168926863.jpg?800
джерело помилки в самому щитуванні з файла, а саме рядок:

 file.getline(c, n); // зчитується рядок довжиною в n символів

що там не так?

5

Re: Зчитування рядків з файла визначеної довжини (c++)

char * c;//c - вказівник, адреса чогось в пам'яті. Ця адреса ще не встановлена
file.getline(c, n);//читаємо за адресою c... wait, oh shi...

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

6

Re: Зчитування рядків з файла визначеної довжини (c++)

koala написав:

char * c;//c - вказівник, адреса чогось в пам'яті. Ця адреса ще не встановлена
file.getline(c, n);//читаємо за адресою c... wait, oh shi...

а як її встановити?

7

Re: Зчитування рядків з файла визначеної довжини (c++)

Очевидно - отримати десь клаптик пам'яті і присвоїти c вказівник на неї.

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

8 Востаннє редагувалося Faraon (30.05.2015 13:43:50)

Re: Зчитування рядків з файла визначеної довжини (c++)

я виділив...

    if (!file.is_open()) // якщо файл не відкритий то повертає 1 якщо відкритий то 0
        cout << "Файл не може бути open!\n";
    else
    {
        int i = 0, n  = 0;
        char * c = new char[100];
        file>>n;
        
        while(!file.eof())
        {
            file.getline(c, n+1); // зчитується рядок довжиною в n символів
            cout<<c;
            //cin.get();
        }

    }

коли я запустив то в консоль вивело 10 символів з тексту... і консоль начебто зависла (не реагує на клавіатуру)
А де решта тектсу? І чому коли я через цикл for хотів вивести хоча б ці десять символів то нічого не виводить?

for(int j = 0; j < 10; j++)
    cout<<c[j];

9

Re: Зчитування рядків з файла визначеної довжини (c++)

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

10 Востаннє редагувалося Faraon (30.05.2015 15:39:12)

Re: Зчитування рядків з файла визначеної довжини (c++)

koala написав:

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

Сам текст? :)

10
Text("_")bbbbbbbbbbbbbbbbbbbbbbbsssssssssssssssssssttttttttttttttlllllllllllll("_")Text.

вивело перші 10 символів

Text("_")b

11

Re: Зчитування рядків з файла визначеної довжини (c++)

Короче зробив по іншому...
ось весь код:

//Варіант 1.
//1. Одним із можливих способів збереження “довгого” тексту – це розділити його на частини 
//(рядки) однакової довжини і зберігати його як масив вказівників на ці рядки. Утворити тип 
//для зберігання тексту вказаним способом. 
//Нехай у текстовому файлі задано ціле число і текст. Число – вказує якої довжини 
//повинні бути рядки. Використовуючи розроблений тип, ввести текст. Видрукувати його у 
//вигляді рядків вказаної довжини. 
//Поміняти місцями парні та непарні рядки. Видрукувати.

#include "SaveText.h"
#include <iostream>
#include <string>
#include <fstream>
using namespace std;

void main()
{
    int n;
    ifstream file; //створили об'єкт
    file.open("Text.txt", ios_base::in);//відкрили файл для читання
    file>>n;

    //припускається, що кількість символів не перевищує 30*n
    SaveText* mas =new SaveText[30];
    

    if (!file.is_open()) // якщо файл не відкритий то повертає 1 якщо відкритий то 0
        cout << "Can not open file!\n";
    else
    {
        int i = 0;

        while(!file.eof())
        {
            char * c = new char[n+1];
            for(int i = 0; i < n; i++)
            {
            c[i] = file.get();
            }
            c[n] = '\0';
            mas[i++].setSaveText(c);
        }

        cout << "Output strings without swaping" << endl;
        for (i = 0; i < 30 && mas[i].getSaveText() != "no text"; i++)
        {
            mas[i].show();
            cout << endl;
        }

        //міняю місцями рядки на парних і непарних позиціях
        cout << endl <<"Some strings are swaped" << endl;
        i = (i%2 == 0?i:i-1);
        for(int j = 0; j < i; j+=2)
        {
            char* temp = mas[j].getSaveText();
            mas[j].setSaveText(mas[j+1].getSaveText());
            mas[j+1].setSaveText(temp);
        }

        //вивід нового масиву рядків
         for (int j = 0; mas[j].getSaveText() != "no text"; j++)
        {
            mas[j].show();
            cout << endl;
        }

    }

    file.close();
    //cin.get();
    cin.get();
};

все працює.

12

Re: Зчитування рядків з файла визначеної довжини (c++)

Дуже некоректне запитання. Що робити якщо тобі прийшов лист і з його вимагають гроші

13

Re: Зчитування рядків з файла визначеної довжини (c++)

NE_BaNit_MeNe_p... написав:

Дуже некоректне запитання. Що робити якщо тобі прийшов лист і з його вимагають гроші

Ви не по темі, якщо хочете поговорити - йдіть в тему для розмов і там питайте.