2014-09-26 4 views
-1

일반 단어를 해적 등가 (hi = ahoy)로 번역하기위한 프로그램을 작성 중입니다.텍스트 파일에서 개별 단어 읽기 및 번역 - C

두 개의 문자열 배열을 사용하여 사전을 만들었으며 이제는 input.txt 파일을 번역하여 output.txt 파일에 넣으려고합니다. 나는 출력 파일에 쓸 수 있지만 그것은 번역 된 첫 단어를 계속해서 새로운 행에 씁니다.

많은 읽기/수색과 내가 말할 수있는 것에서 fscanf()을 사용하여 입력 파일을 읽는 것이 이상적이지는 않지만 사용하기에 더 좋은 기능이 무엇인지 알 수 없습니다. 나는 단어별로 파일 단어를 읽어야하고 (스페이스로 구분) 각 구두점을 읽어야한다. 당신이 다른 영어 단어에 일치 시작으로,

void Translate(char inputFile[], char outputFile[], char eng[][20], char pir[][20]){ 
char currentWord[40] = {[0 ... 39] = '\0'}; 

char word; 

FILE *inFile; 
FILE *outFile; 

int i = 0; 

bool match = false; 

//open input file 
inFile = fopen(inputFile, "r"); 


//open output file 
outFile = fopen(outputFile, "w"); 


while(fscanf(inFile, "%s1023", currentWord) == 1){ 


    if(ispunct(currentWord) == 0){ 

     while(match != true){ 
      if(strcasecmp(currentWord, eng[i]) == 0 || i<28){ //Finds word in English array 
       fprintf(outFile, pir[i]); //Puts pirate word corresponding to English word in output file 
       match = true; 
      } 

      else {i++;} 

     } 
     match = false; 
     i=0; 

    } 
    else{ 
     fprintf(outFile, &word);//Attempt to handle punctuation which should carry over to output 


    } 

} 

} 

답변

0

:

입력 파일 :

Hi, excuse me sir, can you help 
me find the nearest hotel? I 
would like to take a nap and 
use the restroom. Then I need 
to find a nearby bank and make 
a withdrawal. 

Miss, how far is it to a local 
restaurant or pub? 

출력 : 어이 (별도의 행에 46 회, 각각)

이 기능을 번역 i<28은 처음에는 참입니다. 따라서 표현 <anything> || i<28도 바로 참이며 이에 따라 코드는 사전의 첫 단어에서 일치하는 것처럼 동작합니다.

이 문제를 방지하려면 "일치하는 항목이 인덱스 i"과 "일치하는 항목이 없습니다"조건을 별도로 처리해야합니다. 이것은 다음과 같이 얻을 수있다 : dictionary_size는 귀하의 경우 28 것이다

if (i >= dictionary_size) { 
    // No pirate equivalent, print English word 
    fprintf(outFile, "%s", currentWord); 
    break; // stop matching 
} 
else if (strcasecmp(currentWord, eng[i]) == 0){ 
    ... 
} 
else {i++;} 

은 (i<28으로 정지 상태에서 귀하의 시도 기준).

+0

정말 고마워요! 바로 그걸 고정시켰다. 또한 제 코드가 왜 작동하지 않는지에 대해 설명해 주셔서 감사합니다. 앞으로이 실수를 피할 수 있기를 바랍니다. – bullinka

0

다음은 구문 분석에 사용되는 코드 단편입니다. 여기가하는 작업은 다음과 같습니다

이 입력을 감안할 때 :

hi, excuse me sir, how are you. 

그것은 상수 DELIMS에 따라 문자열 배열에 각 단어를두고, 그리고 DELIMS의 CONST의 모든 문자를 삭제합니다. 이것은 원래의 입력 문자열을 파괴합니다. 간단히 문자열 배열을 출력합니다 :

[hi][excuse][me][sir][how][are][you][(null)] 

이제는 stdin에서 입력을 가져 오지만 파일 스트림에서 가져 오기 위해 변경할 수 있습니다. 입력 제한 등을 고려할 수도 있습니다.

#include <stdio.h> 
#include <string.h> 
#define CHAR_LENGTH   100 

const char *DELIMS = " ,.\n"; 
char *p; 
int i; 

int parse(char *inputLine, char *arguments[], const char *delimiters) 
{ 
    int count = 0; 
    for (p = strtok(inputLine, delimiters); p != NULL; p = strtok(NULL, delimiters)) 
    { 
     arguments[count] = p; 
     count++; 
    } 
    return count; 
} 

int main() 
{ 
    char line[1024]; 
    size_t bufferSize = 1024; 

    char *args[CHAR_LENGTH]; 

    fgets(line, bufferSize, stdin); 
    int count = parse(line, args, DELIMS); 
    for (i = 0; i <= count; i++){ 
     printf("[%s]", args[i]); 
    } 
} 
관련 문제