본문 바로가기

별걸다하는 IT/알고리즘 문제풀이

[C/C++ 파일입출력 문제] 텍스트 파일에서 라인 최대 글자수 지정해 재출력하기

단계: 1단계 

문제 유형: 파일입출력

문제 

텍스트 파일을 읽고, 각 라인의 최대 글자수를 입력 받은 후 새로운 텍스트 파일을 만드는 프로그램을 작성하여라.

[조건]

1. 텍스트는 영문자로만 이루어져 있다.

2. 재구성할 때 엔터는 띄어쓰기로 정의된다.
3. 문장 맨 앞에 띄어쓰기는 나오지 않는다.
4. 문장 맨 끝에는 연속된 whitespace 문자가 나오지 않는다. 

입력

라인의 최대 글자 수

출력

텍스트 파일을 라인의 최대 글자수 만큼 재구성한 문자열을 콘솔에 출력 

예시

텍스트 파일: INPUT.txt

In this paper, we explore the feasibility of a
medical training system for breast tumor palpation based on haptic
augmented reality (AR) technology. Haptic AR is an emerging
research area in haptics and virtual reality
(VR), which is concerned
with augmenting the haptic
properties of a real object by means of virtual haptic
feedback. The AR-based tumor palpation system
consists of a real breast sample.

입력: 35 

출력

실습하기 편하시라고 텍스트파일은 첨부해놓을게요.

test.txt
0.00MB
스크롤을 내리면 해설이!

ANSWER

먼저 C언어 파일입출력 스타일로 풀어볼까요

C언어에서 파일 스트림을 열때 fopen이라는 함수를 사용하죠. ㅎㅎ

[C언어-한글자씩 읽기]

#include <stdio.h>
#include <ctype.h>
int main()
{
    //파일입출력
    FILE* fin = fopen("test.txt", "r");
    if (fin == NULL)
    {
        printf("file error\n");
    }

    int line_size   = 0; //라인 글자 수
    char ch         = 0; //읽어올 글자.
    int ch_cnt      = 0; //write한 글자수  

    printf("[입력]최대 라인 글자 수:");
    scanf("%d", &line_size);
    
    //파일 끝까지 한글자씩 읽어온다.
    while ((ch = fgetc(fin)) != EOF)
    {
        //엔터를 만나면 공백으로 치환
        if (ch == '\n')
            ch = ' ';
    
        if (ch_cnt % line_size == 0 && ch_cnt != 0)
        {   
            if (isspace(ch))
                continue;
            putchar('\n');
        }
        putchar(ch); ch_cnt++;
    }
    fclose(fin);
    return 0;
}

파일 스트림으로부터 한 글자씩 읽어오는 fgetc함수와,

표준입출력으로 한 문자를 출력하는 putchar를 사용해서 풀어봤어요.

 

글자가 line_size 크기를 충족하면, 다음 문자는 밑의 행에다가 써줘야 하니까,모듈연산을 이용해서 line_size 배수가 나올 때마다 엔터를 치고 문자를 출력하도록 했어요.그런데 첫 문자가 스페이스가 올 수도 있으니 엔터를 치고 isspace로 걸러줬습니다 :) 간단하게 푸실 수 있는 기본문제였어요. 

 

[C언어 줄바이줄 읽기, 서식출력함수 이용]

#include <stdio.h>
#include <string.h>
#include <ctype.h>
int main()
{

    FILE* fin = fopen("book.txt", "r");
    if (fin == NULL)
    {
        printf("file error\n");
    }
    int line_sz = 35;
    char line[1000] = { 0x00, };
    char text[1000] = { 0x00, };
    int ch_cnt = 0;
    
    while (fgets(line, sizeof(line), fin) != NULL)
    {
        line[strlen(line)-1] = ' '; //엔터 없애기! 
        strcat(text, line);
;    }    
    for (int i = 0; i< strlen(text) ;i += line_sz)
    {
        if (isspace(text[i]))
            i++;
        printf("%.*s\n", line_sz, text + i);
    }
    fclose(fin);
    return 0;
}

이번에는 fgets함수를 이용해 라인별로 읽고, printf 서식포맷을 이용해 출력해봤어요 ㅎㅎ

 

[C++ 한글자씩 읽어들여 풀기]

C언어 한글자 입력하는 풀이랑 같은 풀인데 파일스트림 멤버함수를 이용해서 C++형식으로 바꿔보기만 할거예요.

#include <iostream>
#include <fstream>
using namespace std;
int main()
{
	//파일입출력 
	ifstream fin;
	fin.open("text.txt");
	if (!fin) 
	{
		cout << "File open error\n";
		exit(100);
	}
	int line_size = 0; int ch_cnt = 1;
	char ch		  = 0;

	cout << "[입력]최대 라인 글자 수:";
	cin >> line_size;

	while (!fin.eof()) 
	{
		fin.get(ch);
		if (ch == '\n') ch = ' ';
		if (ch_cnt % line_size == 1 && ch_cnt != 1)  
		{
			if (isspace(ch))
				continue;
			cout << endl;
		}
		cout << ch;
		ch_cnt++; 
	}

	fin.close();
	return 0;
}

C++파일입출력 get함수를 이용했습니다.

 

[C++로 풀기 - 라인단위로 읽기, string]

#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main()
{
    //C++ 파일스트림
    ifstream fin;
    fin.open("test.txt");
    if (!fin) {
        cout << "File open error\n";
        exit(100);
    }
    int line_size = 0;
    string line;  string text;
    cout << "[입력]최대 라인 글자 수:"; cin >> line_size;

    //파일이 끝날때까지 다 입력을받는다. 
    while (!fin.eof())
    {
        getline(fin, line);
        text = text + line + " "; //엔터대신 띄어쓰기를 넣어주기 위함. 
    }
    line.clear(); //line 문자열 다 썼으니 재활용하려고 비워줌 

    //line_size만큼 자르기
    for (int i = 0; i < text.size();)
    {
        line = text.substr(i, line_size);
        i += line.size();
        if (isspace(text[i]))  //문자열 처음이 공백이라면 무시 
            i++;
        cout << line << endl;
    }
    fin.close();
    return 0;
}

이번에는 라인 단위로 읽는 getline 함수를 사용해봤어요. ㅎㅎ 

일단 파일 전체를 쭉 다 읽은 다음에 통으로 string에 저장한 후, string 멤버함수를 이용해 재구성 하는 풀이입니다. 

정성을 공들여 꾹꾹 작성하만큼 ~!

보답광고나 지나가기 전 공감을 살짝쿵 눌러주고 가시면 도움이 됩니다.♥♥

다음에 더 좋은 포스팅으로 봬요!