2010-11-16 279 views
1

我想创建一个函数来从一个文件中读取摩尔斯代码,将其转换为英文文本,将转换后的文本打印到终端,并将其写入输出文件。这里有一个粗略的开始...
#define TOTAL_MORSE 91 #define MORSE_LEN 6试图将莫尔斯电码转换为英文。挣扎

void 
morse_to_english(FILE* inputFile, FILE* outputFile, char morseStrings[TOTAL_MORSE][MORSE_LEN]) 
{ int i = 0, compare = 0; 
char convert[MORSE_LEN] = {'\0'}, *buffer = '\0'; 
//read in a line of morse string from file 
// fgets(buffer, //then what? 
while(((convert[i] = fgetc(inputFile)) != ' ') && (i < (MORSE_LEN - 1))) 
{ i++; 
} 
if (convert[i + 1] == ' ') 
    convert[i + 1] = '\0'; 
//compare read-in string w/morseStrings 
for (i = 48, compare = strcmp(convert, morseStrings[i]); //48 is '0' 
    i < (TOTAL_MORSE - 1) && compare != 0; 
    i++) 
{ compare = strcmp(convert, morseStrings[i]); 
} 
printf("%c", (char)i); 
} 

我已经初始化morseStrings的莫尔斯电码。 这是我现在的功能。它不起作用,我不确定采取什么方法。

我原来的算法的计划是这样的:
1. Scan Morse code in from file, character by character, until a space is reached
1.1 save to a temporary buffer (convert)
2. loop while i < 91 && compare != 0

compare = strcmp(convert, morseString[i]) 

3. if (test ==0) print ("%c", i); 4. loop through this until eof

但..我似乎无法想到一个好办法以测试文件中的下一个字符是否为空格。所以这对我来说非常困难。

我很沮丧,一派的想法,并找到了一个建议,使用这种算法

  1. 阅读空间或EOL 线
  2. -strchr() - 将空格前的字符复制到另一个字符串
    - 使用strcmp()并循环查找字母 - 测试SPACE的下一个字符。
    - 如果是这样,输出另一个空间 -Skip下一莫尔斯字符

  3. 列表项

ENDLOOP

但是,这个循环是一种混乱。我会使用fgets()(我认为),但我不知道要在length参数中放置什么。

无论如何,我很累,很沮丧。我希望对此问题提供任何帮助或见解。如有必要,我可以提供更多代码。

+0

我想你是指ASCII,而不是英文。例如,如果原始邮件是法文的,那么将摩尔斯电码转换为英文可能会非常困难。 :-) – 2010-11-16 15:23:36

+0

Touché,好的先生。 – Nate 2010-11-16 20:44:49

回答

1

你原来的计划看起来不错。不过,当您在缓冲区中检查' '时,您已经偏离了1。它在convert[i],而不是convert[i + 1]。当检测到空间时,循环内部的i++不会发生。

+0

你是对的。我打印的字符也被一个字符打断,但这很容易修复。我认为,在文件扫描策略失效的情况下,我感到非常沮丧,我认为存在更大的问题。谢谢 – Nate 2010-11-16 09:05:50

0

我不会使用strchr()来复杂化。

  1. 循环遍历Inputfile中读取线
  2. 与[strtok的] [1]
  3. 回路记号化线通过令牌和单字母保存(最好附加)到缓冲器
  4. 靠近looops和打印

有点伪代码为ü

while(there is a next line){ 

tokens = strtok(line); 
int i = 0; 

while(tokens hasnext){ 
save to buffer}} 
0

如果您担心的CPU时间,你可以写一个查找表中查找的数值,作为东西像这样的开关:

case '.-': code = "A"; break; 
case '-...': code = "B"; break; 
case '-.-.': code = "C"; break; 

后您的空间分割的莫尔斯电码并发送diferent。和 - 组合到开关获取原始字符。

我希望这个帮助。 此致敬礼。

+0

有趣的想法。不是'switch'语句限于十个例子吗? – Nate 2010-11-16 09:08:19

+0

@SubniC,你只能打开整数值(包括单个字符),而不是字符串。此外,您提供的代码不会编译,因为您已将字符串放在单引号内,而单引号是用于字符。 – 2010-11-16 09:24:57

+0

@Martin:这不是严格正确的--gcc允许你使用最多4个字符来定义整数常量,例如, 'const int x ='abcd';'你也可以使用这样的常量作为case标签,例如'案例'ABCD':'。莫尔斯字母表只使用4个元素作为字母字符,所以SubniC的上述建议可以用于AZ,但不幸的是你需要5个数字和更多的标点符号等。 – 2010-11-16 09:34:10