Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.01.2015, 22:01   #1
Loktar-Ugar
 
Регистрация: 08.01.2015
Сообщений: 6
По умолчанию Конвертер из Паскаля в Си

Дан файл написанный на Паскале в формате txt,программа должна его считывать и выводить на экран,а потом при нажатии кнопки конвертировать на язык Си и сохранять в другой файл.

Часть сам реализовал,часть нашёл в интернете.Но программа не работает(Она компилируется но не работает корректно
).
-Текст с файла в консоль не выводится
-Не конвертирует(пусть даже не все функции написал).

Надеюсь на ваши советы,помощь и подсказки

Код не вместился,залил отдельно.

12-ого надо показывать.
Вложения
Тип файла: txt file1.txt (944 байт, 129 просмотров)
Тип файла: txt konverter.txt (21.4 Кб, 164 просмотров)
Loktar-Ugar вне форума Ответить с цитированием
Старый 09.01.2015, 12:19   #2
Loktar-Ugar
 
Регистрация: 08.01.2015
Сообщений: 6
По умолчанию

Проблему с выводом содержимого файла в консоль решилась..

Осталась проблема с конвертацией
Loktar-Ugar вне форума Ответить с цитированием
Старый 09.01.2015, 12:55   #3
Loktar-Ugar
 
Регистрация: 08.01.2015
Сообщений: 6
По умолчанию

Немного подправил программу.

Конвертер это курсовая,а курсовые распределили рандомно,кому-то повезло а кому-то нет.

Осталось понять как мой file1.txt привязать к функции перевода с одного языка другой.
Вложения
Тип файла: txt konverter.txt (21.6 Кб, 134 просмотров)
Loktar-Ugar вне форума Ответить с цитированием
Старый 09.01.2015, 22:04   #4
Loktar-Ugar
 
Регистрация: 08.01.2015
Сообщений: 6
По умолчанию

У меня есть файл file.txt я выделил 2 функции считывания для конвертации и вывод обработанного текста в res2.txt.

по идее даже при неудачной конвертации он должен его создать но не создаёт

Код:
int Converter::ReadText(char * s1)
    {
        ifstream fin("file.txt");
            if ((file_in = fopen(s1, "file1.txt")) == NULL){
            return 0;
        }
        fseek(file_in, 0, SEEK_END);
        inlen = ftell(file_in);
        fseek(file_in, 0, SEEK_SET);
        if (inlen>lenprog) inlen = lenprog;
        inlen = fread(instr,1,inlen,file_in);
        instr[inlen] = 0;
        inpos = 0;
        outlen = 0;
        return 1;
    }
    //вывод обработанного текста
    void Converter::PutText(char * s2)
    {
        ofstream out("res2.txt");
        if ((file_out = fopen(s2, "res2.txt")) == NULL)
        {
            return;
        }
        fwrite(outstr,outlen,1,file_out);
    }
Основная функция перевода

Код:
void Converter::Translate()
    {
        int b;
        int k;
        koper1 = koper2 = 0;
        put_str("#include <stdio.h>\n\n"); //для scanf и printf
        do
        {
            b = 1;
            ReadWordS();
            k = funckeyW(); //проверка на ключевое слово
            if (k==keyW_var){ //начало блока переменных
                koper1++;
                if (!funcvar(1)) {
                    Error_oper();
                }
                else koper2++; }
                else
                    if (k==keyW_begin){ //начало блока операторов
                        if (!funcbegin(1)) {
                            Error_oper();
                        }
                        b = 0;
                    }
                    else
                        if (find_Comment()) fin_Comment(); //комментарии
                        else {
                            koper1++;
                            Error_oper();
                        };
        } while (b==1);
        if (instr[inpos]!='.') return; //точка в конце программы
        inpos++;
    }
Вызов процедуры в классе Меню выглядит так.

Код:
void Menu::Change()
    {
        int y;
        bool flag = true;
        while (flag)
        {
            system("cls");
            cout << "Выберите пункт меню: " << endl << "1 – Загрузить файл;" << endl << "2 – Конвертировать;" <<endl<<"3 - выход." << endl;
            cin >> y;
            if (y == 1)
            {
                VvodFail();
                system("pause");
            }
            if (y == 2)
            {
                Converter ReadText();
                Converter Translate();
                Converter PutText();
                ///Convertation();
                system("pause");
            }
            if (y == 3) flag = false;
        }
    }
};
Вложения
Тип файла: txt file.txt (164 байт, 129 просмотров)

Последний раз редактировалось Loktar-Ugar; 09.01.2015 в 22:09.
Loktar-Ugar вне форума Ответить с цитированием
Старый 10.01.2015, 01:03   #5
Smogg
Участник клуба
 
Регистрация: 14.06.2011
Сообщений: 1,138
По умолчанию

Цитата:
Код:
    void Converter::PutText(char * s2)
    {
        ofstream out("res2.txt");
        if ((file_out = fopen(s2, "res2.txt")) == NULL)
        {
            return;
        }
        fwrite(outstr,outlen,1,file_out);
    }
Ну совсем ниче не понятно...
Зачем объявлять поток вывода, если не используется? Я точно не знаю, но поток вполне может сразу по дефолту открыть файл с эксклюзивными правами на запись и разрешать стороннее лишь чтение.

Порядок и смысл аргументов у fopen() вообще-то такой:
Цитата:
FILE * fopen ( const char * filename, const char * mode );
Smogg вне форума Ответить с цитированием
Старый 10.01.2015, 20:27   #6
Loktar-Ugar
 
Регистрация: 08.01.2015
Сообщений: 6
По умолчанию

Задачу упростили теперь сказали что можно создать 2 массива - 1 со словами на Паскале,2-ой со словами Си и сделать одинаковые индексы к ним,и реализовать такой алгоритм

1. Прочитать строку (до первого пробельного символа) из файла с программой на Паскале.
2. Проверить, является ли оно ключевым словом, т.е. есть ли такая строка в массиве. Если есть, то каков ее индекс в массиве (ноль, один, …).
3. В файл с программой на Си записать сроку из массива с индексом, полученным в пункте 2.

я часть уже сделал...

но с заменой на одинаковые индексы пока сложно..(кто что может посоветовать и где поискать)...Наработки кода.

Код:
class Converter
{
public:
	
	char s[256]; //идент-р переменной
	int tp; 
	int tid;
	char instr[1000],
	outstr[1000];
int inlen,outlen,inpos;//текущие позиции (строки входные, выходные, позиция в строке входной)
int koper1,koper2,ker;//эти переменные считают количество операторов во входном, выходном файле и кол-во ошибок
int lenght_world; //длина "слова"
int wtype; //тип "слова"
int wnumf; //0 - целое число, 1 - дробное
int dt; //размер отступа (от начала строки)
Converter  *next,*np, *p,*vars, *lvars,*head, *ntype,*typeslist; 

	// здесь идет проверка на ключевое слово,
	// сравниваются полученное нами слово со словом из списка
	// и если да, то возвращается номер слова в списке
	// проверка на ключевое слово
	///int Converter::funckeyW()


int Converter::funckeyW(char s)
	{
		ifstream fin("file.txt");
		if (!fin.is_open())
			cout<<"Файл отсутствует!\n";
		else
		{
			while (!fin.eof())
			{
            while (fin!='\0')
			{
			fin.getline(instr,s);
			}
		for (int i=0; i<Key_WordsP_num; i++)
		{// просмотр всего массива Key_Words_num
			for (int i=0; i<Key_WordsC_num; i++)
			{
				if(Key_WordsP_num[KeyW]==Key_WordsC_num[KeyWC])
				{
					ofstream fout;
		fout.open("res2.txt");
		fout<<i;
		fout.close();
				}
			}
		}	
			}
			}
		return 0;
		}

Последний раз редактировалось Loktar-Ugar; 10.01.2015 в 20:35.
Loktar-Ugar вне форума Ответить с цитированием
Старый 10.01.2015, 22:39   #7
Smogg
Участник клуба
 
Регистрация: 14.06.2011
Сообщений: 1,138
По умолчанию

Цитата:
Сообщение от Loktar-Ugar Посмотреть сообщение

Код:
            while (fin!='\0')
что бы это значило...
Smogg вне форума Ответить с цитированием
Старый 11.01.2015, 11:10   #8
Loktar-Ugar
 
Регистрация: 08.01.2015
Сообщений: 6
По умолчанию

До 1-ого пробельного символа
Loktar-Ugar вне форума Ответить с цитированием
Старый 11.01.2015, 23:44   #9
Smogg
Участник клуба
 
Регистрация: 14.06.2011
Сообщений: 1,138
По умолчанию

Цитата:
Сообщение от Loktar-Ugar Посмотреть сообщение
До 1-ого пробельного символа
А я что-то не увидел в хелпе, что у ifstream есть операторы сравнения...
Smogg вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
конвертер Host-2013 Общие вопросы Delphi 25 03.02.2013 21:48
Конвертер VanHelsing C# (си шарп) 6 17.10.2011 14:25
Конвертер VanHelsing Софт 0 22.07.2010 11:46
Конвертер на С++ VanHelsing Общие вопросы C/C++ 5 21.07.2010 15:01
конвертер malevich Общие вопросы Delphi 10 14.02.2007 23:19