2016-10-25 4 views
0

저는 Uni에서 공부하는 초급 프로그래머입니다. 그 순간. 숙제 : 텍스트 기반 어드벤처 게임을 작성하십시오 (프로그래밍 연구 2 개월 미만 : /).C - 파일의 텍스트/문장을 문자열 배열로 읽어들입니다.

선생님은 게임에서 사용하는 텍스트가 파일에 저장되어야한다고 말했습니다. 처음에는 프로그램에서 해당 파일의 "모든 텍스트"를 읽은 다음 프로그램에서 문자열의 텍스트를 사용해야합니다 (필자는 짐작합니다).

첫 번째 생각은 1 문장으로 1 문장을 읽지 만, 문장에는 단어 사이에 공백이 있기 때문에 운동하지 않으려 고했지만 읽으려고 할 때 프로그램을 읽을 때 공백이 있으면 동일한 단어 대신 다른 문자열에 단어를 저장합니다.

예를 들면 다음과 같습니다. 내 txt 파일에 4 줄이 있습니다. 줄 1 : 어떤 방법으로 가야합니까? 2 호선 : 앞으로 3 호선 : 왼쪽 행 4 : 마우스 오른쪽

는 내가 4 개 스트링의 텍스트를 읽을 때, 다음 LINE 1, 두 번째의 LINE 2 등 첫 번째 문자열에있을 것입니다 생각 하지만 어떻게 된거 야? '어느 쪽'이 첫 번째 문자열에 있었는지, "way"는 두 번째 문자열에있었습니다.

잘못된 설명을 드려 죄송합니다. 내 문제가 무엇인지 이해하길 바랍니다. 어떻게 첫 번째 문자열로만 Line 1을 읽을 수 있습니까?

char decisions[4][200]; 
FILE *fp; 
fp=fopen("text.txt", "r"); 
fscanf(fp, "%s %s %s %s", &decisions[0], &decisions[1], &decisions[2], &decisions[3]); 
fclose(fp); 

printf("%s\n %s\n %s\n %s\n", decisions[0], decisions[1], decisions[2], decisions[3]); 
: 나는이이 "오류"를 일으키는 내 코드입니다

.. "그래, 나는 새로운 문자열로이 공간 후에 단어를 넣어한다"로 프로그램이 공간을 계산하지 않습니다 생각

결정 [0]은 내 txt 파일의 첫 번째 줄에서 질문을 읽어야하고 다른 3자는 3 chosing 옵션을 가져야합니다. 나는이 일이하고 싶은 그게 문제 :

+3

'fgets()'를보세요. – EOF

+0

나는 그것으로 볼 것이다, 제안을위한 감사합니다! – Noxter

답변

1

에 구분 기호로 줄 바꿈을 사용합니다. 각 문자열의 최대 바이트 200 것을 알고 당신이 4 개 라인이있는 경우,이 루프에 fgets에 전달 :

int i; 
for (i=0; i<3; i++) 
    { 
    fgets(decisions[i], 200, fp); 
    } 

fgets는 N 발견 새로운 라인 또는 EOF 때까지 버퍼에 바이트를 읽습니다. 따라서 각 줄마다 200자를 넘지 않아야합니다.

+1

오, 정말 대단한 답변입니다! 당신은 실제로 내 코드를 위해 작성했습니다. 고마워, 이건 실제로 도움이 많이, 지금은 fgets의 사용을 이해하기 시작 :) 이것은 나에게서 결정적인 upvote입니다! :) 고마워요! :) – Noxter

-2

/명시 적으로, 당신은 fgets을 사용할 수 라인으로 라인을 읽으려면 형식 문자열

fscanf(fp, "%s[\n]%s[\n]%s[\n]%s", &decisions[0], &decisions[1], &decisions[2], &decisions[3]); 
+0

제안 된 솔루션을 실제로 사용해 보셨습니까? 그것이 효과가 있다고 생각하지 마십시오. '% s'에 대한'fscanf' 매뉴얼에서 : "** 비 공백 ** 문자의 순서와 일치합니다". OP의 입력 첫 행에는 공백이 있습니다. – kaylum

+0

변환 지정자'% s'와'% []'를 분리 할 수 ​​없게하는 스택 오버 플로우가 무엇인지 궁금합니다. 가장 호기심이 많은. – EOF

0

아니지만, 당신은 수 있습니다fscanf와 함께 할.

내용 text.txt

"Whussup?" "All of the things that have not been screwn tightly to the ground" "Buh, who cares!" "You don't wanna know, mate!" 
"Why?" "Because!" "Ask Joe!" "I'm a doctor, not an engineer!" 

의 첫 번째 라인으로 해석 할 수 있습니다

#include <stdio.h> 
#include <stdlib.h> 
// ALL CHECKS OMMITTED! 
int main() 
{ 
    FILE *fp; 
    char decisions[4][200]; 

    fp = fopen("text.txt", "r"); 
    fscanf(fp, "\"%199[^\"]\" \"%199[^\"]\" \"%199[^\"]\" \"%199[^\"]\"", 
     decisions[0], decisions[1], decisions[2], decisions[3]); 
    fclose(fp); 
    printf("LINE1: %s\nLINE2: %s\nLINE3: %s\nLINE4: %s\n", decisions[0], 
     decisions[1], decisions[2], decisions[3]); 
    exit(EXIT_SUCCESS); 
} 

트릭은 \"%199[^\"]\"입니다, 그것은 "을하지 두 번 사이 199 자까지 소요 따옴표 뒤에는 공백이옵니다. 그러나 text.txt의 형식은 엄격해야하며 그렇지 않으면 작동하지 않습니다.

하지만 실제로는 fgets 또는 그와 비슷한 것을 사용해보십시오. 두통의 양을 크게 줄이십시오!

+0

답변 주셔서 감사합니다! 내 코드에 대해이 코드를 작성해 주셔서 대단히 기쁩니다! 비록 많은 양의 텍스트로 작업하는 것이 훨씬 쉬워 보이기 때문에, 나는 fgets를 이해하기 위해 시간을 할애한다고 생각합니다. 나는이 대답을 고맙지 만, 나는 그것을 upvote 밀어! 감사합니다. :) – Noxter

관련 문제