Помощь в проектировании и реализации конкретных алгоритмов и интерфейса приложений на любых языках программирования, в любых средах разработки, для любых аппаратно-программных платформ.
kolya8920 » 29-01-2010 15:41
Здравстввуйте, подскажите, что исправить в программе, чтобы она читала текст из файла и записывала исходный результат туда же, а то я написал сам код конвертирования, а вот с файлами проблема, в чем проблема?
Программа преобразовывает символы английского алфавита и цифры... между буквами добавляется пробел, а между словами 3 пробела!!!
если убрать чтение из файла и запись в файл все работает!!!
Код: Выделить всё #include <stdio.h> #include <string.h> #include <stdlib.h> main () { FILE *fInput; FILE *fOutput; char filename[50]; char outfilename[50]; printf("\nInput file name:\n"); scanf("%s",&filename); printf("\nInput outfile name:\n"); scanf("%s",&outfilename); fInput = fopen(filename, "rt"); fOutput = fopen(outfilename,"wt"); if (fInput == NULL) { printf ("\n Error,cannot open this file: %s\n",filename); system("PAUSE"); return 0; } if (fOutput == NULL) { printf("\n Error,cannot open output file: %s\n",outfilename); system("PAUSE"); return 0; } char *str2morse(char *str, char *mstr, int max) { static char *letters[] = {".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "....", "..", ".---", "-.-", ".-..", "--", "-.", "---", ".--.", "--.-", ".-.", "...", "-", "..-", "...-", ".--", "-..-", "-.--", "--.."}; static char *digits[] = {"-----", ".----", "..---", "...--", "....-", ".....", "-....", "--...", "---..", "----."}; static char space[] = " "; int c; int index; /*FILE *fInput; char filename[50]; printf("\nInput file name:\n"); scanf("%s",&filename); fInput = fopen(filename, "rt"); if (fInput == NULL) { printf ("\n Error,cannot open this file: %s\n",filename); system("PAUSE"); return 0; }*/ //printf("\nBBeDiTe Pa3mep slovo\n"); //scanf("%s",str); *mstr = '\0'; while(!feof(fInput)) //while ( *str ) { if ( strlen(mstr) > 0 )// Вставить пробел, если не первый символ { if ( strlen(mstr) + strlen(space) < max ) strcat(mstr, space); else break; } c = toupper(*str); fgets(str, max, fInput); if ( c >= 'A' && c <= 'Z' )// Если с - буква { index = c - 'A'; if ( strlen(mstr) + strlen(letters[index]) < max ) strcat(mstr, letters[index]); else break; } else if ( c >= '0' && c <= '9' )// Если с - цифра { index = c - '0'; if ( strlen(mstr) + strlen(digits[index]) < max ) strcat(mstr, digits[index]); else break; } else if ( c == ' ' )// Если с - пробел { if ( strlen(mstr) + strlen(space) < max ) strcat(mstr, space); else break; } str++; } fclose(fInput); return mstr; } /*FILE *fOutput; char outfilename[50]; printf("\nInput outfile name:\n"); scanf("%s",&outfilename); fOutput = fopen(outfilename,"wt"); if (fOutput == NULL) { printf("\n Error,cannot open output file: %s\n",outfilename); system("PAUSE"); return 0; }*/ char text[BUFSIZ]; char morse[BUFSIZ]; while ( fgets(text, BUFSIZ, stdin) ) { if ( str2morse(text, morse, BUFSIZ) == NULL ) { fprintf(stderr, "Can't convert string!\n"); return 1; } else { fputs(morse, fOutput); // fputc('\n', fOutput); // printf("%s\n", morse); } printf("Good bye!\n"); fclose(fOutput); system("PAUSE"); return 0; } }
kolya8920
Участник
Сообщения: 40Зарегистрирован: 14-10-2009 22:15Откуда: СПБ
Gassa » 31-01-2010 15:51
Как минимум, во всех местах, где читается или пишется строка, нужно делать не так:
Код: Выделить всё scanf("%s",&filename);А так:
Код: Выделить всё scanf("%s",filename);filename --- это и так не символ, а указатель на нулевой символ строки.
Gassa
Участник
Сообщения: 271Зарегистрирован: 11-03-2005 02:20Откуда: СПбГУ::МатМех / Купчино
kolya8920 » 02-02-2010 01:53
А в чем еще может быть проблема??? Я вот тут еще кой чего исправил, теперь проблема с пробелами!!! чтобы из файла читались все символы надо между ними ставить пробелы, как это исправить?
Код: Выделить всё #include <stdio.h> #include <string.h> #include <stdlib.h> main () { FILE *fInput; FILE *fOutput; char filename[50]; char outfilename[50]; printf("\nInput file name:\n"); scanf("%s",filename); printf("\nInput outfile name:\n"); scanf("%s",outfilename); fInput = fopen(filename, "rt"); fOutput = fopen(outfilename,"wt"); if (fInput == NULL) { printf ("\n Error,cannot open this file: %s\n",filename); system("PAUSE"); return 0; } if (fOutput == NULL) { printf("\n Error,cannot open output file: %s\n",outfilename); system("PAUSE"); return 0; } char *str2morse(char *str, char *mstr, int max) { static char *letters[] = {".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "....", "..", ".---", "-.-", ".-..", "--", "-.", "---", ".--.", "--.-", ".-.", "...", "-", "..-", "...-", ".--", "-..-", "-.--", "--.."}; static char *digits[] = {"-----", ".----", "..---", "...--", "....-", ".....", "-....", "--...", "---..", "----."}; static char space[] = " "; static char space1[] = " "; int c; int index; *mstr = '\0'; while(!feof(fInput)) { fscanf(fInput, "%s", str); if ( strlen(mstr) > 0 )// Вставить пробел, если не первый символ { if ( strlen(mstr) + strlen(space) < max ) strcat(mstr, space); else break; } c = toupper(*str); if ( c >= 'A' && c <= 'Z' )// Если с - буква { index = c - 'A'; if ( strlen(mstr) + strlen(letters[index]) < max ) strcat(mstr, letters[index]); else break; } else if ( c >= '0' && c <= '9' )// Если с - цифра { index = c - '0'; if ( strlen(mstr) + strlen(digits[index]) < max ) strcat(mstr, digits[index]); else break; } else if ( c == ' ' )// Если с - пробел { if ( strlen(mstr) + strlen(space) < max ) strcat(mstr, space); else break; } str++; } return mstr; } char text[BUFSIZ]; char morse[BUFSIZ]; while ( fgets(text, BUFSIZ, stdin) ) { if ( str2morse(text, morse, BUFSIZ) == NULL ) { fprintf(stderr, "Can't convert string!\n"); return 1; } else { fprintf (fOutput, "%s\n", text); fprintf (fOutput, "%s", morse); //printf("\nPe3yJITAT --> %s\n\n", morse); } printf("Good bye!\n\n"); system("PAUSE"); return 0; } fclose(fInput); fclose(fOutput); }
kolya8920
Участник
Сообщения: 40Зарегистрирован: 14-10-2009 22:15Откуда: СПБ
Gassa » 03-02-2010 02:27
kolya8920 писал(а): А в чем еще может быть проблема??? Я вот тут еще кой чего исправил, теперь проблема с пробелами!!! чтобы из файла читались все символы надо между ними ставить пробелы, как это исправить?
Код: Выделить всё while(!feof(fInput)) { fscanf(fInput, "%s", str); <обработать *str, то есть str[0]> str++; }Дык, правильно, так и написано сделать. Прочитать строку в массив str, затем обработать начальный элемент, и дальше опять читать новую строку. Надо бы вместо того, что я пометил как угловые скобки, сделать что-то типа
Код: Выделить всё n = strlen (str); for (int i = 0; i < n; i++) { <то, что было, но не для c = toupper (*str), а для c = toupper (str[i])> }
Иван Казменко.
... Если файлы brain.dll и hands.sys повреждены либо отсутствуют, обратитесь в сервис-центр разработчика.
Gassa
Участник
Сообщения: 271Зарегистрирован: 11-03-2005 02:20Откуда: СПбГУ::МатМех / Купчино
kolya8920 » 09-02-2010 09:57
Но если я все делаю так и меняю
Код: Выделить всё c = toupper (*str) на c = toupper (str[i])получается ошибка здесь
Код: Выделить всё if ( c >= 'A' && c <= 'Z' )
kolya8920
Участник
Сообщения: 40Зарегистрирован: 14-10-2009 22:15Откуда: СПБ
kolya8920 » 09-02-2010 22:39
сделал так
Код: Выделить всё #include <stdio.h> #include <string.h> #include <stdlib.h> main () { FILE *fInput; FILE *fOutput; char filename[50]; char outfilename[50]; printf("\nInput file name:\n"); scanf("%s",filename); printf("\nInput outfile name:\n"); scanf("%s",outfilename); fInput = fopen(filename, "rt"); fOutput = fopen(outfilename,"wt"); if (fInput == NULL) { printf ("\n Error,cannot open this file: %s\n",filename); system("PAUSE"); return 0; } if (fOutput == NULL) { printf("\n Error,cannot open output file: %s\n",outfilename); system("PAUSE"); return 0; } char *str2morse(char *str, char *mstr, int max) { static char *letters[] = {".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "....", "..", ".---", "-.-", ".-..", "--", "-.", "---", ".--.", "--.-", ".-.", "...", "-", "..-", "...-", ".--", "-..-", "-.--", "--.."}; static char *digits[] = {"-----", ".----", "..---", "...--", "....-", ".....", "-....", "--...", "---..", "----."}; static char space[] = " "; int c; int index; int i; int n; *mstr = '\0'; while(!feof(fInput)) { fscanf(fInput, "%s", str); n = strlen (str); for (i = 0; i < n; i++) { if ( strlen(mstr) > 0 )// Âñòàâèòü ïðîáåë, åñëè íå ïåðâûé ñèìâîë { if ( strlen(mstr) + strlen(space) < max ) strcat(mstr, space); else break; } c = toupper (str[i]); // c = toupper(*str); if ( c >= 'A' && c <= 'Z' )// Åñëè ñ - áóêâà { index = c - 'A'; if ( strlen(mstr) + strlen(letters[index]) < max ) strcat(mstr, letters[index]); else break; } else if ( c >= '0' && c <= '9' )// Åñëè ñ - öèôðà { index = c - '0'; if ( strlen(mstr) + strlen(digits[index]) < max ) strcat(mstr, digits[index]); else break; } else if ( c == ' ' )// Åñëè ñ - ïðîáåë { if ( strlen(mstr) + strlen(space) < max ) strcat(mstr, space); else break; } str++; } } return mstr; } char text[BUFSIZ]; char morse[BUFSIZ]; while ( fgets(text, BUFSIZ, stdin) ) { if ( str2morse(text, morse, BUFSIZ) == NULL ) { fprintf(stderr, "Can't convert string!\n"); return 1; } else { fprintf (fOutput, "%s\n", text); fprintf (fOutput, "%s", morse); printf("\nPe3yJITAT --> %s\n\n", morse); } printf("Good bye!\n\n"); system("PAUSE"); return 0; } fclose(fInput); fclose(fOutput); }теперь все работает но с разделением слов проблема, прога удаляет предыдущей передпробелом символ!!!
kolya8920
Участник
Сообщения: 40Зарегистрирован: 14-10-2009 22:15Откуда: СПБ
kolya8920 » 09-02-2010 23:53
kolya8920
Участник
Сообщения: 40Зарегистрирован: 14-10-2009 22:15Откуда: СПБ
Gassa » 12-02-2010 02:23
kolya8920 писал(а): теперь все работает но с разделением слов проблема, прога удаляет предыдущей передпробелом символ!!!
У меня твоя программа удаляет каждый чётный символ.
Потому что надо делать либо c = str[i] и i++, либо c = *str и str++. Иначе --- так, как ты делаешь --- i++ и str++ сдвигают каждый раз на два символа, а не на один.
То есть я бы убрал строку "str++;".
Вообще, я бы сделал всю программу проще:
Код: Выделить всё #include <stdio.h> static char *letters[] = {".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "....", "..", ".---", "-.-", ".-..", "--", "-.", "---", ".--.", "--.-", ".-.", "...", "-", "..-", "...-", ".--", "-..-", "-.--", "--.."}; static char *digits[] = {"-----", ".----", "..---", "...--", "....-", ".....", "-....", "--...", "---..", "----."}; int main (void) { FILE * fin, * fout; char buf [128]; int i; fin = fopen ("input.txt", "rt"); fout = fopen ("output.txt", "wt"); while (fscanf (fin, " %s", buf) != EOF) { for (i = 0; buf[i]; i++) if (buf[i] >= 'A' && buf[i] <= 'Z') fprintf (fout, "%s ", letters[buf[i] - 'A']); else if (buf[i] >= '0' && buf[i] <= '9') fprintf (fout, "%s ", digits[buf[i] - '0']); fprintf (fout, " "); } fclose (fin); fclose (fout); return 0; }
Иван Казменко.
... Если файлы brain.dll и hands.sys повреждены либо отсутствуют, обратитесь в сервис-центр разработчика.
Gassa
Участник
Сообщения: 271Зарегистрирован: 11-03-2005 02:20Откуда: СПбГУ::МатМех / Купчино
kolya8920 » 13-02-2010 13:14
А можешь объяснить свой листинг... что здесь для чего?
kolya8920
Участник
Сообщения: 40Зарегистрирован: 14-10-2009 22:15Откуда: СПБ
Gassa » 13-02-2010 18:15
kolya8920 писал(а): А можешь объяснить свой листинг... что здесь для чего?
В каждой строчке написано довольно понятно, что она делает...
Например, вероятно, самая непонятная строчка
Код: Выделить всё while (fscanf (fin, " %s", buf) != EOF)сначала пропускает во входном файле все пробельные символы перед следующим словом, потом читает из входного файла следующее слово и записывает его в buf. Если в процессе выяснилось, что слово прочитать невозможно, потому что закончился файл, основной цикл while завершается.
Ну а объяснения типа
Код: Выделить всё fprintf (fout, " "); // вывести два пробела в выходной файлуж сам как-нибудь догадайся
.
Иван Казменко.
... Если файлы brain.dll и hands.sys повреждены либо отсутствуют, обратитесь в сервис-центр разработчика.
Gassa
Участник
Сообщения: 271Зарегистрирован: 11-03-2005 02:20Откуда: СПбГУ::МатМех / Купчино
kolya8920 » 15-02-2010 21:29
посмотри я правильно откоментировал?? я одну строчку пометил не понятно и предположение оставил =)
Код: Выделить всё #include <stdio.h> #include <string.h> #include <stdlib.h> main () { FILE *fInput; FILE *fOutput; static char *letters[] = {".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "....", "..", ".---", "-.-", ".-..", "--", "-.", "---", ".--.", "--.-", ".-.", "...", "-", "..-", "...-", ".--", "-..-", "-.--", "--.."}; static char *digits[] = {"-----", ".----", "..---", "...--", "....-", ".....", "-....", "--...", "---..", "----."}; char filename[50]; char outfilename[50]; char buf [128]; int i; printf("\nInput file name:\n"); scanf("%s",filename); printf("\nInput outfile name:\n"); scanf("%s",outfilename); fInput = fopen(filename, "rt"); fOutput = fopen(outfilename,"wt"); if (fInput == NULL) { printf ("\n Error,cannot open this file: %s\n",filename); system("PAUSE"); return 0; } if (fOutput == NULL) { printf("\n Error,cannot open output file: %s\n",outfilename); system("PAUSE"); return 0; } while (fscanf (fInput, " %s", buf) != EOF) // сначала пропускает во входном файле все пробельные символы // перед следующим словом, потом читает из входного файла следующее слово // и записывает его в buf. Если в процессе выяснилось, // что слово прочитать невозможно, потому что закончился файл, // основной цикл while завершается. { for (i = 0; buf[i]; i++) // Обнуляем i, и задаем чтение посимвольно buf[i] if (buf[i] >= 'A' && buf[i] <= 'Z') // если buf[i] буква то: fprintf (fOutput, "%s ", letters[buf[i] - 'A']); [color=#FF0000]// не понятно letters[buf[i] - 'A'???? // я так думаю вместо буквы ставим символ[/color] else if (buf[i] >= '0' && buf[i] <= '9') fprintf (fOutput, "%s ", digits[buf[i] - '0']); [color=#FF0000]// не понятно digits[buf[i] - '0']???? // вместо цифры ставим символ[/color] fprintf (fOutput, " "); // вывести два пробела в выходной файл } fclose (fInput); fclose (fOutput); system("PAUSE"); return 0; }А почему мы ставим размер буфера именно 128??
Код: Выделить всё char buf [128];
kolya8920
Участник
Сообщения: 40Зарегистрирован: 14-10-2009 22:15Откуда: СПБ
Gassa » 15-02-2010 23:47
letters --- это массив строк, в котором нулевой элемент --- это код в азбуке Морзе буквы 'A' , первый --- код буквы 'B' , второй --- код буквы 'C' , и так далее. Какой элемент этого массива надо вывести? Номер этого элемента --- это номер буквы в алфавите, начиная с нуля. А выражение buf[i] - 'A' как раз и задаёт этот номер. Например, 'A' - 'A' == 0 , 'B' - 'A' == 1 , 'C' - 'A' == 2 и так далее. Почему размер буфера 128 --- просто какое-то достаточно большое число: мы надеемся, что ни одно слово не окажется длиннее. Если не верится --- можно сделать больше.
Иван Казменко.
... Если файлы brain.dll и hands.sys повреждены либо отсутствуют, обратитесь в сервис-центр разработчика.
Gassa
Участник
Сообщения: 271Зарегистрирован: 11-03-2005 02:20Откуда: СПбГУ::МатМех / Купчино
kolya8920 » 16-02-2010 00:08
А какое максимальное значение можно задавать??
kolya8920
Участник
Сообщения: 40Зарегистрирован: 14-10-2009 22:15Откуда: СПБ
Gassa » 16-02-2010 02:13
kolya8920 писал(а): А какое максимальное значение можно задавать??
Зависит от используемого компилятора и количества доступной памяти.
Можно поэкспериментировать и выяснить.
Но, скорее всего, больше, чем 128, не нужно.
Иван Казменко.
... Если файлы brain.dll и hands.sys повреждены либо отсутствуют, обратитесь в сервис-центр разработчика.
Gassa
Участник
Сообщения: 271Зарегистрирован: 11-03-2005 02:20Откуда: СПбГУ::МатМех / Купчино
kolya8920 » 16-02-2010 08:54
Спасибо за помощь!!! =)))
kolya8920
Участник
Сообщения: 40Зарегистрирован: 14-10-2009 22:15Откуда: СПБ
kolya8920 » 22-03-2010 20:01
Привет всем! Помогите пожалуйста сделать программу в обратном направление, сижу делать нечего, до жути интересно как это реализовать!
Делаю не работает, где косяк?
Код: Выделить всё #include <stdio.h> #include <string.h> #include <stdlib.h> main () { FILE *fInput; FILE *fOutput; static char *letters[] = {".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "....", "..", ".---", "-.-", ".-..", "--", "-.", "---", ".--.", "--.-", ".-.", "...", "-", "..-", "...-", ".--", "-..-", "-.--", "--.."}; char *alfa[] = {"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"}; char filename[50]; char outfilename[50]; char buf [128]; int i; printf("\nInput file name:\n"); scanf("%s",filename); printf("\nInput outfile name:\n"); scanf("%s",outfilename); fInput = fopen(filename, "rt"); fOutput = fopen(outfilename,"wt"); if (fInput == NULL) { printf ("\n Error,cannot open this file: %s\n",filename); system("PAUSE"); return 0; } if (fOutput == NULL) { printf("\n Error,cannot open output file: %s\n",outfilename); system("PAUSE"); return 0; } while (fscanf (fInput, "%s", buf) != EOF) { for (i = 0; buf[i]; i++) if (letters[buf[i]]) fprintf (fOutput, "%s", alfa[buf[i]]); fprintf (fOutput, " "); } fclose (fInput); fclose (fOutput); printf("\n\nGood bye!\n\n"); system("PAUSE"); return 0; }
kolya8920
Участник
Сообщения: 40Зарегистрирован: 14-10-2009 22:15Откуда: СПБ
Вернуться в Классическое программирование
Перейти:
Выберите форум
------------------ Обратная связь
Гостевая книга
Обсуждение сайта
Обсуждение форума
Правила форума
Софт
Программное обеспечение – Windows
Программное обеспечение – UNIX
"Железная" канцелярия
Платформа
Видеосистема
Устройства отображения видео данных
Носители информации и устройства чтения/записи данных
Цифровой звук и акустические системы
Мобильные технологии
Фото и видео
Офисная техника
Подбор конфигурации и модернизация ПК
Корпуса и электропитание
Extreme
Манипуляторы и игровые приставки
Прочее железо
Решение комплексных аппаратных проблем
Сетевые технологии и компьютерные сети
Системное администрирование и IT-безопасность компьютерных сетей
Сетевое оборудование
Доступ в Интернет
Разработка информационных систем
Веб-мастеринг и базы данных
Классическое программирование
Игровые форумы
Action Games
Strategy Games
Simulators Games
RPG Games
Quest, adventure games
Общий игровой форум
Инфо
Полезная информация
Черный список
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей