C++/기초를 탄탄히 세워주는 C++ 프로그래밍 입문(황준하 저)

기초를 탄탄히 세워주는 C++ 프로그래밍 입문 12장 연습문제

꾸준함. 2017. 7. 12. 16:13

[12.1]

/*

실행 결과와 같이 1부터 10까지의 값들에 대한 제곱값과 나누기 3을 한 값을 "out1.txt" 파일로 출력해본다

각 출력값들에 대해 적절한 크기의 필드를 지정하고 오른쪽 정렬로 출력하도록 한다.

나누기 3을 한 값의 결과는 실수로 처리될 수 있어야 하며 소수점 이하 첫 번째 자리까지만 출력하도록 한다

*/

#include <iostream>

#include <fstream>

using namespace std;

 

int main(void)

{

        ofstream fout("out1.txt"); //출력 스트림 생성 및 파일 열기

 

        if (!fout)

        {

               cout << "파일 열기 에러" << endl;

               return 1;

        }

 

        for (int i = 1; i <= 10; i++)

        {

               double divide = i / (3.0);

               int square = i*i;

               fout.width(10);

               fout.setf(ios_base::fixed, ios_base::floatfield); //부동소수점 표시

               fout.precision(1); //소수점 한자리

               fout << i << "\t" << square << "\t" << divide << endl;

        }

 

        fout.close();

        return 0;

}

[12.2]

/*

연습문제 12.1애서 만든 "out1.txt"로부터 데이터를 입력받아 화면에 출력해 본다

데이터를 읽을 때는 int, int, double형의 순서대로 읽어 들여야 제대로 값이 입력됨을 명심한다.

*/

#include <iostream>

#include <fstream>

using namespace std;

 

int main(void)

{

        int num1, num2;

        double num3;

        ifstream fin("out1.txt");

 

        if (!fin)

        {

               cout << "파일 열기 에러" << endl;

               return 1;

        }

 

        fin >> num1;

 

        while (!fin.eof()) //파일이 끝나기 전까지

        {

               cout << num1 << "\t";

               fin >> num2;

               cout << num2 << "\t";

               fin >> num3;

               cout << num3 << endl;

               fin >> num1;

        }

 

        fin.close();

        return 0;

}

 

[12.3]

/*

연습문제 12.1에서 작성한 "out1.txt" 파일의 끝부분에 11부터 20까지의 정수에 대한 제곱값과 나누기 3의 값을 저장해 본다.

기존 파일의 내용은 그대로 남아있어야 한다

*/

#include <iostream>

#include <fstream>

using namespace std;

 

int main(void)

{

        ofstream fout("out1.txt", ios_base::out|ios_base::app); //출력 스트림 생성 및 파일 열기, 기존 데이터 유지 위해 trunc 포함 X

 

        if (!fout)

        {

               cout << "파일 열기 에러" << endl;

               return 1;

        }

 

        for (int i = 11; i <= 20; i++)

        {

               double divide = i / (3.0);

               int square = i*i;

               fout.width(10);

               fout.setf(ios_base::fixed, ios_base::floatfield); //부동소수점 표시

               fout.precision(1); //소수점 한자리

               fout << i << "\t" << square << "\t" << divide << endl;

        }

 

        fout.close();

        return 0;

}

[12.4]

/*

파일을 읽어 각 알파벳 문자가 몇 개씩 있는지를 출력하는 프로그램을 작성한다.

소문자와 대문자는 동일한 것으로 취급한다.

문자 단위 입력 함수인 get함수를 사용하면 편할 것이다

*/

#include <iostream>

#include <fstream>

using namespace std;

 

int main(void)

{

        ifstream fin("alphabet.txt");

        int alphabet[26] = { 0, }; //하나하나 세기에는 많으니 배열 선언

 

        if (!fin)

        {

               cout << "파일 열기 에러" << endl;

               return 1;

        }

 

        char ch = fin.get(); //문자 단위 입력 함수

 

        while (!fin.eof())

        {

               if (ch >= 65 && ch <= 90)

               {

                       alphabet[ch - 65]++;

               }

               if (ch >= 97 && ch <= 122)

               {

                       alphabet[ch - 97]++; //대소문자 똑같이 취급

               }

               fin.get(ch);

        }

 

        for (int i = 0; i < 26; i++)

        {

               char character = i + 65;

               cout << character << ": " << alphabet[i] << " ";

               if (i != 0 && i % 10 == 0)

                       cout << endl;

        }

        cout << endl;

        fin.close();

        return 0;

}

[12.5]

/*

파일 전체를 줄 단위로 읽어 화면에 출력해 본다

getline 함수에 대한 연습문제이다

*/

#include <iostream>

#include <fstream>

using namespace std;

 

#define MAX 256

 

int main(void)

{

        ifstream fin("text.txt");

        char buff[MAX];

 

        while (!fin.eof())

        {

               fin.getline(buff, MAX, '\n'); //MAX 크기의 버프에 저장

               cout << buff << endl;

        }

        fin.close();

 

        return 0;

}

 

[12.6]

/*

int형 변수를 선언하고 값을 1094795585로 초기화한다.

그리고 이 값을 파일로 출력하되 한번은 << 연산자를 사용하고,

또 한번은 write 함수를 사용하여 출력한 후 결과를 서로 비교해 본다.

똑같은 작업을 표준 출력 객체인 cout을 통해서도 출력해본다

*/

#include <iostream>

#include <fstream>

using namespace std;

 

int main(void)

{

        int num = 1094795585;

 

        cout << "그냥 출력했을 경우 num: ";

        cout << num << endl;

        ofstream fout("out5.txt", ios_base::out | ios_base::trunc | ios_base::binary);

 

        fout.write((char*)&num, sizeof(num)); //write 함수를 사용

 

        fout.close();

 

        ifstream fin("out5.txt", ios_base::in | ios_base::binary);

 

        cout << "write 함수 사용한 뒤 read로 읽어들인 num: ";

        while (fin.read((char*)&num, sizeof(num))) //read

               cout << num;

        cout << endl;

        fin.close();

        return 0;

}

[12.7]

/*

다음과 같은 student 구조체가 있다.

실행 결과와 같이 사용자로부터 학생 정보를 입력받아 파일로 저장한 후,

다시 그 파일로부터 학생 정보를 읽어 들여 화면에 출력해본다

*/

#include <iostream>

#include <fstream>

using namespace std;

 

typedef struct student

{

        char name[20]; //이름

        int age; //나이

        char dpt[20]; //소속학과

}Student;

 

int main(void)

{

        Student std;

        char sel = 'y';

 

        ofstream fout("out6.txt", ios_base::out | ios_base::trunc);

 

        while (1)

        {

               cout << "학생정보를 입력하시오(: y, 아니요: n) ";

               cin >> sel;

               if (sel == 'n')

                       break;

               while (sel != 'y'&&sel != 'n')

               {

                       getchar(); //버퍼 지운다

                       cout << "재입력: ";

                       cin >> sel;

               }

               cout << "이름: ";

               cin >> std.name;

               cout << "나이: ";

               cin >> std.age;

               cout << "학과: ";

               cin >> std.dpt;

               fout.write((char*)&std, sizeof(std));

        }

 

        fout.close();

 

        cout << "파일에 저장된 학생 정보를 출력합니다" << endl;

 

        ifstream fin("out6.txt", ios_base::in);

 

        while (fin.read((char*)&std, sizeof(std)))

        {

               cout << "이름: " << std.name << endl;

               cout << "나이: " << std.age << endl;

               cout << "학과: " << std.dpt << endl;

               cout << endl;

        }

 

        fout.close();

        return 0;

}

 

[12.8]

/*

하나의 텍스트 파일을 또 다른 파일로 복사하되 파일 내용을 역방향으로 출력한다

*/

#include <iostream>

#include <fstream>

using namespace std;

 

int main(void)

{

        ifstream fin("out7.txt"); //복사할 텍스트 파일

        ofstream fout("out8.txt");

 

        fin.seekg(0, fin.end); //파일 끝으로 가서

        long length = fin.tellg(); //파일 크기

 

        char c;

        char before='a';

        while (length--)

        {

               fin.seekg(length, fin.beg);

               fin >> c;

               //cout << c << endl;

               if (before == c)

               {

                       fout << endl;

                       continue;

               }

 

               fout << c;

               before = c;

        }

        return 0;

}


개발 환경:Visual Studio 2017


지적, 조언, 질문 환영입니다! 댓글 남겨주세요~


[참고] 기초를 탄탄히 세워주는 C++ 프로그래밍 입문 황준하 저


*9번 문제는 마저 풀고 포스팅하겠습니다

반응형