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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 29.05.2014, 22:37   #1
ivan.tiran
Форумчанин
 
Аватар для ivan.tiran
 
Регистрация: 24.08.2011
Сообщений: 138
По умолчанию Последняя строка в файле считывается два раза.

Доброго времени суток. Пишу программу, которая разбивает код ассемблера для одноадресной машины на сегменты. То есть в каждой строке определяет метку, команду, операнд и комментарий.

Тестовый вариант файла пока выглядит так.

Цитата:
me123456tka: mul r * proverka
mov h * proverka513..1
Проблема в том, что последняя строка считывается два раза.

Код:
#include <stdlib.h>
#include <stdio.h>
#include <iostream>
#include <string.h>

using namespace std;


struct stroka
{int num;
bool bmetka,bkommand,boperand,bkomment;
char *metka, *kommand, *operand,*komment;
stroka *next;	
};

//bool poiskkomment(char *str,int &indexk,int &kommentlen,char ob='*',int strsize=500);
int poiskkomment(char *str,int &indexk,char ob='*',int strsize=500);  
//indexk - номер ячейки со знаком комментария, ob - каким символом обозначается начало комментария
//функция вернёт 1 в том случае, если комментарий присутствует, 0 в противном случае
//bool poiskmetka(char *str,int &metkalen,int pozkomment,char ob=':',int strsize=500);
int poiskmetka(char *str,int pozkomment,char ob=':',int strsize=500);
//функция вернёт 1 в том случае, если метка присутствует, 0 в противном случае
void delete_probel(char *str,int strsize=500);//удаление лишних пробелов и знаков табуляций
int poiskkom(char *str,int metkalen,int &pozkom, int strsize=500,char metkakomment='*');
int poiskoperand(char *str,int endkommand,int &pozoperand,int strsize=500,char metkakomment='*');//endkommand - позиция конца комманды в строке

int main()
{

	

char str[500];
char adress[255];
FILE *f1;

do
{
cout << "Введите адрес файла: ";
gets(adress);
cout << endl;
}
while(not(f1=fopen(adress, "r")));


stroka *begin;
begin = new stroka;
begin->bmetka=0;
begin -> bkommand=0;
begin -> boperand=0;
begin -> bkomment=0;
begin -> next = begin;//создали первый пустой элемент списка



while(feof(f1)) 
{
fgets(str,500,f1);
delete_probel(str);
if(strlen(str)>0)
{
int kommentdlina,pozkomment;
kommentdlina=poiskkomment(str,pozkomment);	
//cout << str[pozkomment+kommentdlina-1] << endl;	
cout << kommentdlina << endl;	
	
}
	
	}





	
fclose(f1);	
	getchar();
	return 0;
}

void delete_probel(char *str,int strsize)
{
int i=0;
char tt[strsize];
while(str[i]!='\0' && (str[i]=='	' || str[i]==' '))	i++;

if(str[i]=='\0') return;

int k=-1;

do
{
	k++;
tt[k]=str[k+i];	
}
while(str[k+i]!='\0');//удаляем первые пробелы
	
for(int z=0;tt[z]!='\0';z++) if((tt[z]==' ' || tt[z]=='	') && (tt[z+1]==' ' || tt[z+1]=='	')) 	
{//удаляем промежуточные пробелы
int p=z+1;	
for(;tt[p]!='\0';p++) {tt[p]=tt[p+1];} 
	
z--;	
}	
strcpy(str,tt);	
}



int poiskkomment(char *str,int &indexk,char ob,int strsize) 
//indexk - номер ячейки со знаком комментария, ob - каким символом обозначается начало комментария
{
int kommentlen,i=0;

while(str[i]!='\0' && str[i]!=ob) i++;
if(str[i]==ob)
{
i++;	
if(str[i]=='	' || str[i]==' ')	indexk=i++;
indexk=i;

while(str[i]!='\0') i++;
i--;


while(str[i]=='	' || str[i]==' ') i--;

kommentlen=i-indexk+1;
return kommentlen;	
}
else {indexk=i;return 0;}	
	
}

int poiskmetka(char *str,int pozkomment,char ob,int strsize)
{
int i=0;

while(str[i]!='\0' && str[i]!=ob) i++;
if(str[i]==ob && i < pozkomment && i>0)
return i;
else return 0;
}

int poiskkom(char *str,int metkalen,int &pozkom, int strsize,char metkakomment)
{
if (metkalen!=0)metkalen++;
if(str[metkalen]=='	' || str[metkalen]==' ') metkalen++;

pozkom=metkalen;

while(str[metkalen]!='\0' && str[metkalen]!='	' && str[metkalen]!=' ' && str[metkalen]!=metkakomment) metkalen++;

return metkalen-pozkom;

}


int poiskoperand(char *str,int endkommand,int &pozoperand,int strsize,char metkakomment)
{	
endkommand++;
pozoperand=endkommand;
while(str[endkommand]!='\0' && str[endkommand]!='	' && str[endkommand]!=' ' && str[endkommand]!=metkakomment) endkommand++;		
return endkommand-pozoperand;
}
Как решить проблему?
ivan.tiran вне форума Ответить с цитированием
Старый 29.05.2014, 23:07   #2
WorldMaster
Старожил
 
Аватар для WorldMaster
 
Регистрация: 25.08.2011
Сообщений: 2,841
По умолчанию

А читать то надо вот так:
Код:
while(!feof(f1))
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два.
WorldMaster вне форума Ответить с цитированием
Старый 29.05.2014, 23:24   #3
ivan.tiran
Форумчанин
 
Аватар для ivan.tiran
 
Регистрация: 24.08.2011
Сообщений: 138
По умолчанию

Цитата:
Сообщение от WorldMaster Посмотреть сообщение
А читать то надо вот так:
Код:
while(!feof(f1))

я именно так и считываю, забыл вернуть отрицание. Вопрос остаётся открытым, последняя строка считывается два раза
Код:
while(!feof(f1)) 
{
fgets(str,500,f1);
delete_probel(str);
if(strlen(str)>0)
{
int kommentdlina,pozkomment;
kommentdlina=poiskkomment(str,pozkomment);	
//cout << str[pozkomment+kommentdlina-1] << endl;	
cout << kommentdlina << endl;	
	
}
	
	}
ivan.tiran вне форума Ответить с цитированием
Старый 31.05.2014, 17:16   #4
ivan.tiran
Форумчанин
 
Аватар для ivan.tiran
 
Регистрация: 24.08.2011
Сообщений: 138
По умолчанию

Проблему решил. Функция fgets считывает несуществующую последнюю строку. Нужно было сделать проверку.


Код:

if(fgets(данные))
{
........
.......
}
ivan.tiran вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Последняя строка из списка выводится 2 раза, С++ elCamino Помощь студентам 2 03.11.2013 04:44
Дописать функцию последняя строка kipish_lp Microsoft Office Excel 5 05.07.2010 07:12
последняя строка 0mega Microsoft Office Excel 4 02.06.2010 22:07
Почему из файла считывается два значения, если там одно yorik1984 Помощь студентам 3 19.03.2010 01:48
два раза к одной таблице Kolik317 SQL, базы данных 2 26.12.2009 13:58