2010-11-16 2 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. Читать линию
  2. Loop

    -strchr() для пространства или EOL - скопируйте символы перед пробелом в другую строку
    -Используйте strcmp() и найдите петлю, чтобы найти письмо -Проверьте следующий символ для пробела.
    -Если так, выход в другое пространство -Skip к следующему Морзе характера

  3. Список пункт

ENDLOOP

Но это петли отчасти сбивает с толку. Я бы использовал fgets() (я думаю), но я не знаю, что добавить в аргумент длины.

В любом случае, я устал и разочарован. Я был бы признателен за любую помощь или понимание этой проблемы. При необходимости я могу предоставить больше кода.

+0

Я думаю, вы имеете в виду ASCII, а не английский. Преобразование кода Морзе на английский язык может быть очень сложным, если исходное сообщение на французском языке, например. :-) –

+0

Touché, хороший сэр. – Nate

ответ

1

Ваш первоначальный план выглядит отлично. Тем не менее, вы отключены на 1, когда вы проверяете ' ' в буфере. Он находится в convert[i], а не convert[i + 1]. i++ внутри цикла не происходит, когда пространство обнаружено.

+0

Вы абсолютно правы. Персонаж, которого я печатал, тоже был отключен, но это было легко исправлено. Я просто расстроился, я думаю, с файловыми сканирующими стратегиями, которые не работали, что я предположил, что существует большая проблема. Спасибо – Nate

0

Я бы не использовал strchr(), чтобы усложнить ситуацию.

  1. Loop через файл_ввода Чтение строки
  2. разметить линию с [strtok] [1]
  3. перебрать лексемы и сохранить (лучший Append) отдельные буквы в буфер
  4. близких looops и печати

немного псевдокода для и

while(there is a next line){ 

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

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

Если вы обеспокоены процессорное время вы можете написать таблицу поиска, чтобы найти значение, то, как переключатель, как это:

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

После разделения азбуки Морзе пространства и отправить Diferent. и - комбинации с переключателем для получения оригинала.

Я надеюсь, что эта помощь. С уважением.

+0

Интересная идея. Не является ли выражение 'switch' ограниченным до десяти случаев? – Nate

+0

@SubniC, вы можете включать только интегральные значения (включая одиночные символы), а не строки. Кроме того, код, который вы указали, не скомпилирован, потому что вы помещаете строки в одинарные кавычки, когда одинарные кавычки предназначены для символов. –

+0

@Martin: это не совсем правильно - gcc позволяет вам определять целочисленные константы, используя до 4 символов, например. 'const int x = 'abcd';' и вы также можете использовать такие константы, как метки меток, например. 'case 'ABCD':'. Алфавит morse использует только 4 элемента для буквенных символов, поэтому приведенное выше предложение от SubniC будет работать для AZ, но, к сожалению, вам нужно 5 для чисел и больше для пунктуации и т. Д. –

Смежные вопросы