2010-11-16 324 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