从文本文件中读取单个单词并翻译 - C.

时间:2014-09-26 03:29:21

标签: c file-io c-strings

我正在编写一个程序(用于课堂作业),将普通单词翻译成他们的盗版对象(hi = ahoy)。

我使用两个字符串数组创建了字典,现在我正在尝试翻译input.txt文件并将其放入output.txt文件中。我能够写入输出文件,但它只会在新行上反复写入翻译后的第一个单词。

我已经做了大量的阅读/搜索,据我所知,使用fscanf()阅读我的输入文件并不理想,但我无法弄清楚什么会更好功能使用。我需要逐字逐句读取文件(用空格分隔),并在每个标点符号中读取。

输入文件:

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?

输出:ahoy(46次,每次在另一条线上)

翻译功能:

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


    }

}

}

2 个答案:

答案 0 :(得分:0)

当你开始匹配不同的英语单词时,i<28最初是正确的。因此,表达式<anything> || i<28也会立即生效,相应地,代码的行为就像在字典中的第一个单词上找到匹配一样。

为避免这种情况,您应该处理&#34;在索引i&#34;处找到匹配项。和#34;找不到匹配&#34;条件分开。这可以通过以下方式实现:

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++;}

dictionary_size在您的情况下为28(基于您使用i<28停止条件的尝试)。

答案 1 :(得分:0)

这是我用来解析问题的代码片段。这就是它的作用:

鉴于此输入:

hi, excuse me sir, how are you.

它根据DELIMS常量将每个单词放入一个字符串数组中,并删除DELIMS const中的任何char。这会破坏你原来的输入字符串。我只是打印出字符串数组:

[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]); 
    } 
}