#pragma warning (disable:4996)
#include <stdio.h>
#include <string.h>
#define MAX 100
char buffer[MAX];
char txt[80];
char *token1, *token2, *token3;
int main()
{
FILE*in_fp = fopen("input_1.txt", "r");
FILE*out_fp = fopen("aligned.txt", "w");
int cnt = 0;
int max = 0;
while (!feof(in_fp))
{
fread(buffer, 1, 1, in_fp);
if(buffer[0] == '\n')
{
continue;
}
//
if(buffer[0] == '\t' || buffer[0] == ' ')
{
if(cnt == 0)
{
fwrite(buffer, 1, 1, out_fp);
max++;
}
cnt++;
}
else
{
cnt = 0;
}
txt[0] = buffer[0];
if(cnt == 0)
{
fwrite(buffer, 1, 1, out_fp);
max++;
}
if(max >= 79)
{
max = 0;
buffer[0] = '\n';
fwrite(buffer, 1, 1, out_fp);
}
}
fclose(in_fp);
fclose(out_fp);
return 0;
}
#if 0
chapter one the riddle house the villagers of little hangleron still called it
riddle it many years since the riddle family had lived it stood onsome of its w
indows tiles missing from its and ivy overonce a and easily the largest and gra
ndest building for milesthe riddle house was now and the little hagletons all a
greed that the old house was halfstrange and horrible had happened something th
at the older of liked to discuss when topics for gossip were the story soand ha
d been embroidered in so many that nobody was quite thewas every version of the
started in the same fifty years atdaybreak on a fine morning when the riddle h
ouse had still been a maid had entered the drawing room to find all threethe ma
#endif
----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.
매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.
when the riddle house had still been a maid had entered the drawing room to find
all three the maid had run screaming down the hill into the village
there with their eyes wide cold as still in their dinner the police were and
the whole of little hangleton had with curiosity and nobody wasted their breath
입력 파일에서 두 칸 이상 띄어져 있는 곳이 출력에는 한 칸만 되어 있는 것으로 보아 입력에 있는 단어 사이 공백을 그대로 유지하는 건 아닌 거겠죠? 기본적으로 한 칸씩 띄고, 80칸을 맞추기 위해 필요하다면 추가로 더 띄우는 것으로 보입니다.
그런데 문제에 각 단락 마지막 줄은 그냥 왼쪽 정렬하라고 되어 있는데 출력 예시의 첫 단락 마지막 줄에 보면 all과 three 사이가 두 칸 띄워져 있고요.
두번째 단락의 경우 두 칸씩 띄어진 곳을 다 한 칸만 띄우면 그 다음 줄 the 까지 첫 줄에 쓸 수 있습니다.
그 다음, 본문에 올려주신 코드를 가지고 왜 잘못된 출력이 나오는지 분석하자니 주석도 전혀 없는 상태라 너무 시간이 걸리고... 디버거를 쓰시든가, 하다못해 곳곳에 printf라도 집어 넣어서, 현재 무슨 단어를 읽었고 어느 if 블록에 진입해서 어떤 처리를 하고 있는지, 그게 작성하신 분 의도에 맞는 동작인지 검토해보시는 걸 추천드리고요.
근데 저라면 지금처럼 txt 배열에 한 줄 입력을 조립하다가 공백을 하나 추가할 때마다 그 뒤의 문자들을 전부 한 칸씩 뒤로 미루는 for 루프를 쓰는 것보다... 읽어들인 단어들을 리스트로 가지고 있다가 출력할 때 단어 사이에 공백을 추가로 출력하는 게 편하지 싶습니다.
단어 리스트 초기화
while ( 한 줄 읽고 )
if ( 빈 줄이면 )
현재까지 리스트에 담긴 단어들을 왼쪽 정렬로 출력
리스트 초기화
else
while ( 한 단어씩 뽑아내어 )
if 리스트의 단어들과 이번 단어를 합쳐 한 칸씩 띄웠을 때의 길이 > 80
리스트의 단어들을 80칸에 맞춰 좌우 정렬로 출력
리스트 초기화
이번 단어를 리스트에 추가
// 입력 끝
현재까지 리스트에 담긴 단어들을 왼쪽 정렬로 출력
끝
void 리스트에 담긴 단어들을 출력하는 함수
if (왼쪽 정렬)
리스트의 단어들을 단어 하나 출력하고 공백 한 칸 출력하고... 반복
else // 좌우 정렬
80칸을 맞추기 위해 추가해야 할 공백 갯수 계산(예: 7)
그 공백을 집어넣을 수 있는 칸의 수 = 단어 수 - 1 (예: 5)
7개의 공백을 5칸에 고르게 분배하려면, 처음 2칸은 공백 2개, 나머지 3칸은 공백 1개인 걸 계산
리스트의 단어들을 하나씩 출력하면서 저 계산에 맞춰 각 단어 사이에 공백 추가 출력
위와 같이 작성하면 출력은 다음처럼 나옵니다.
chapter one the riddle house the villagers of little hangleron still called it
riddle it many years since the riddle family had lived it stood on some of its
windows tiles missing from its and ivy over once a and easily the largest and
grandest building for miles the riddle house was now and the little hagletons
all agreed that the old house was half strange and horrible had happened
something that the older of liked to discuss when topics for gossip were the
story so and had been embroidered in so many that nobody was quite the was every
version of the started in the same fifty years at daybreak on a fine morning
when the riddle house had still been a maid had entered the drawing room to find
all three the maid had run screaming down the hill into the village
there with their eyes wide cold as still in their dinner the police were and the
whole of little hangleton had with curiosity and nobody wasted their breath
pretending to feel about the for they had been most elderly and riddle had been
and and their had if all the villagers cared about was the identity of their
murderer three did not all drop dead of natural causes on the same the hanged
the village did a roaring trade that the whole to have turned out to discuss the
they were rewarded for their cook arrived dramatically in their midst and
announced to a man called frank bryce had just been cried several frank bryce
was the he lived alone in a cottage on the of the riddle frank had come back
from the war with a very crowds and loud and had been working for the riddles
ever there was a rush to buy the cook drinks and hear more thought he was she
told the eagerly listening after her sure if offered him a cuppa offered it a
hundred never wanted to he said a woman at the had a hard he likes the quiet no
reason to else had a key to the back barked the been a spare key hanging in the
cottage far back as i can nobody forced the no broken all frank had to do was
creep up to the big house
...
아 코드에 harry.txt 랑 aligned
아 코드에 harry.txt 랑 aligned.txt를 각각 input.txt output.txt 라 생각하시면 됩니당
참고해보세요.
- 일단. 1바이트씩. 모든 문자를 80자로 만들었습니다.
- 다음 라인으로 가는 경우. 문자열이 있을때. 공백으로 채워야 하는거 같네요.
현재 라인에 마지막 문자와
다음 라인에 첫번째에 문자가 있으면.
현재 라인에 마지막을 공백으로 채우는것을 추가하면 될것 같습니다. ㅇ_ㅇ;;
- 다음 줄의 첫 문자가 '\t' 이나 ' ' 일경우도. 예외 처리가 필요해보입니다.
- Qt SDK 에 문자 정렬하는 예제가 있습니다. (자간 장평 포함...)
https://www.youtube.com/watch?v=0A3mk3gU6j0
https://ide-run.goorm.io
----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.
매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.
각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com
좌우로 80자로 딱 정렬이 되야하고, 단어가 잘리면
좌우로 80자로 딱 정렬이 되야하고, 단어가 잘리면 안되는게 조건입니다 그리고 입력파일에 공백 라인이 있으면 그것도 그대로 출력해야하는데 생각보다 쉽지 않군요 ㅜ
참고해보세요.
그럼. 문자가 아니라... 단어'인지도 알아야 하는거네요. ㅇ_ㅇ??
종이접기 아닌 경우
종이 O
접기 O
종이접기 인 경우
종이 X
접기 X
----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.
매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.
각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com
.
.
----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.
매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.
각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com
.
.
----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.
매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.
각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com
.
.
출력 예시 파일이 좀 이상해보입니다.
출력 예시 파일이 좀 이상해보입니다.
입력 파일에서 두 칸 이상 띄어져 있는 곳이 출력에는 한 칸만 되어 있는 것으로 보아 입력에 있는 단어 사이 공백을 그대로 유지하는 건 아닌 거겠죠? 기본적으로 한 칸씩 띄고, 80칸을 맞추기 위해 필요하다면 추가로 더 띄우는 것으로 보입니다.
그런데 문제에 각 단락 마지막 줄은 그냥 왼쪽 정렬하라고 되어 있는데 출력 예시의 첫 단락 마지막 줄에 보면 all과 three 사이가 두 칸 띄워져 있고요.
두번째 단락의 경우 두 칸씩 띄어진 곳을 다 한 칸만 띄우면 그 다음 줄 the 까지 첫 줄에 쓸 수 있습니다.
그 다음, 본문에 올려주신 코드를 가지고 왜 잘못된 출력이 나오는지 분석하자니 주석도 전혀 없는 상태라 너무 시간이 걸리고... 디버거를 쓰시든가, 하다못해 곳곳에 printf라도 집어 넣어서, 현재 무슨 단어를 읽었고 어느 if 블록에 진입해서 어떤 처리를 하고 있는지, 그게 작성하신 분 의도에 맞는 동작인지 검토해보시는 걸 추천드리고요.
근데 저라면 지금처럼 txt 배열에 한 줄 입력을 조립하다가 공백을 하나 추가할 때마다 그 뒤의 문자들을 전부 한 칸씩 뒤로 미루는 for 루프를 쓰는 것보다... 읽어들인 단어들을 리스트로 가지고 있다가 출력할 때 단어 사이에 공백을 추가로 출력하는 게 편하지 싶습니다.
위와 같이 작성하면 출력은 다음처럼 나옵니다.
좋은 하루 되세요!
댓글 달기