본문 바로가기

QT/QT 4.6.2

파일의 특정 부분 입 / 출력하기 (QTextStream::readLine, QString::split)

텍스트 파일 같은 문서 파일의 특정 내용만을 읽어오는 파일 입출력을 구현해 보았다.

보통 변수 선언 한 형태의 내용을 직접 소스에 옮길 때,

값들만 있으면 되기 때문에, 변수명과 값을 분리 시켜야 될 때가 있다.

그 때 사용하면 좋은 것 같아 구현을 해 보았다.

간단히 소스를 보면,

/****************************************************************
                               FileIO.h
****************************************************************/
#ifndef FILEIO_H
#define FILEIO_H
#include 

struct FileInit
{
    QString name;
    QTime time;
    QString address;
    QString phone;
    int age;
};

class FileIO
{
    public:
        void FileWrite();
        void FileRead();
private:
        FileInit fileinit;
};

#endif // FILEIO_H


/****************************************************************
                               FileIO.cpp
****************************************************************/
#include "FileIO.h"


void FileIO::FileWrite()
{
    QTextStream out(&file);
    QString ttime;
    QFile file("C:/Qt/2010.02.1/TestFile/test2.txt");
    if(!file.open(QIODevice::WriteOnly))
    {
        QMessageBox *box = new QMessageBox;
        box->setText("WriteError");
        box->show();
        return ;
    }
    
    ttime.sprintf("%d:%d", fileinit.time.hour(), fileinit.time.minute());
    
    out << fileinit.name << "\n";
    out << ttime << "\n";
    out << fileinit.address << "\n";
    out << fileinit.phone << "\n";
    out << fileinit.age << "\n";

    file.close();
}

void FileIO::FileRead()
{
    QTextStream in(&file);
    QString str, str2, str3;
    QStringList fields, data;
    
    QFile file("C:/Qt/2010.02.1/TestFile/test.txt");
    if(!file.open(QIODevice::ReadOnly))
    {
        QMessageBox *box = new QMessageBox;
        box->setText("ReadError");
        box->show();
        return ;
    }

    while(!in.atEnd())
    {
        str = in.readLine();     // 파일의 하나의 라인 전부를 가져와 저장
        fields = str.split('='); // '='를 중심으로 짤라 저장
        str2 = fields.value(0);

        if(str2 == "name")
        {
           fileinit.name = fields.value(1);
        }
        else if(str2 == "time")
        {
           str3 = fields.value(1);
           data =str3.split(':');
           QString a = data.value(0);
           QString b = data.value(1);
           fileinit.time.setHMS(a.toInt(), b.toInt(), 0);
        }
        else if(str2 == "address")
        {
            fileinit.address = fields.value(1);
        }
        else if(str2 == "phone")
        {
            fileinit.phone = fields.value(1);
        }
        else if(str2 == "age")
        {
            QString c = fields.value(1);
            fileinit.age = c.toInt();
        }
        else if(str2 == "test")
        {
            QString d = fields.value(1);
            fileinit.age = d.toInt();
        }
    }
    file.close();
}

/****************************************************************
                               main.cpp
****************************************************************/
#include 
#include "FileIO.h"

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

    FileIO file;
    file.FileRead();
    file.FileWrite();

    return app.exec();
}


이런식으로 구현을 하였다.

그래서 결과를 보면

 
 


이렇게 값만 빠져서 다른 파일에 저장된 것을 볼 수 있다.

간단히 소스 설명을 하면,

str = in.readLine();
fields = str.split('=');
str2 = fields.value(0);

이 3개의 함수가 핵심인데,

먼저  readLine()함수 같은 경우는
파일의 내용 중 한 라인의 모든 내용을 한꺼번에 가져와 저장 시킬때 사용을 하게 된다.
여기에서 마지막의 '\n'은 제외하고 가져 오게 된다.

그리고 split() 함수 같은 경우는
QString의 멤버함수로 문자열 중에서 지정된 매개변수를 중심으로 짤라 QStringList에 차례대로 넣는 함수이다.

예를 들어,
aa=bb=cc가 있을 경우 split('=') 함수를 쓰게 되면,
aa, bb, cc로 나눠져 각각 QStringList에 차례대로 들어 가게 된다. 

그리고 QStringList::value() 함수는 
방금 위에서 저장한 값들을 꺼낼 경우에 사용하게 된다.

현재 QStringList에 aa,bb,cc가 저장이 되어 있다고 가정을 할 때, 순서는 배열과 동일하게
0번에 aa, 1번에 bb, 2번에 cc에 저장이 되어 있다.

그래서
value(0)을 쓰게 되면, aa가 출력이 되고,
value(1)을 쓰게 되면, bb가 출력이 되고,
value(2)을 쓰게 되면, cc가 출력이 된다.