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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.01.2009, 16:03   #1
xDyPx
Форумчанин
 
Аватар для xDyPx
 
Регистрация: 21.01.2009
Сообщений: 148
По умолчанию Скопировать из списка в файл

Вообще такая лаба у меня:
Из исходного файла скопировать во второй файл все регулярные слова, не содержащие гласных букв(которые содержат ТОЛЬКО большие английские буквы), разделив их пробелами, а в третий – все числа, подсчитав их общую сумму.

Вот текст всей программы:
=========================
Код:
// lab4.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <conio.h>
#include <stdio.h>
#include <iostream>
using namespace std;
#include <stdlib.h>
#include <math.h>

struct node
{
char key; //перемнная в поле
node* next; // указатель на следующий элемент
};

//добавление в список нового элемента
void Add(node* &head, char k) //используются список head и переменная К
{
if (head==NULL) //если списка нет
{
head=new node; // создается новый элемент
head->key=k; // в новом элементе хранится знач кеу=к
head->next=NULL; //элемент указывает на конец спмска
}
else //если список есть
{
node* temp=head; //объявляется перременная
while (temp->next !=NULL) //пока ссылка на следующий элемент существует..
temp=temp->next; //переходить на следующий элемент
temp->next=new(node); //если не сущ. следующего элемента, создать его
temp=temp->next; //в переменную Темр присваивается значение следующей переменной
temp->key=k; //заполняет его
temp->next=NULL; //следующей переменной не сущечтвует
}
}

//вывод на печать список
void Print(node* head)
{
node* temp=head;
while (temp !=NULL) // пока не конец списка...
{
printf("%c",temp->key); //..выводить элемент..
temp=temp->next; //.. и переходить на следующий
}
}

void FPrint(node* head)
{
FILE *FO;
node* temp=head;
if( (fopen_s(&FO , "output1.txt", "w+" )) !NULL )
{
while (temp !=NULL) // пока не конец списка...
{
fputc(temp->key, FO);
//fwrite(temp->key,sizeof(head), 1, FO); //..выводить элемент..
temp=temp->next; //.. и переходить на следующий
}
}
}

//очистка списка
void KillList(node* &head)
{
if (head==NULL) return; //если список пуст, ничего не делать
KillList(head->next); //удаляется следующий элемент
delete head ; //удаляется на него ссылка..
head=NULL; //..и указывается ссылка на конец списка

}

int _tmain(int argc, _TCHAR* argv[])
{
node* list=NULL;
char ch;
int F;
char c=' ';
FILE *FI, *FO, *FO2;
int sum;
int summa;
int a;
//поиск регулярных слов
if( (fopen_s( &FI, "input.txt", "r" )) == 0 )
{
if( (fopen_s(&FO , "output1.txt", "w+" )) == NULL )
{
F=0;
while (!feof(FI))
{
fread( &ch,1,1,FI );
if (ch==' ')
{
F=0;
if (list!=NULL) { Print(list); fwrite(&list,sizeof(list),1,FO); cprintf(" "); KillList(list); };
}
else
{
if (!((ch=='B') || (ch=='C') || (ch=='D') || (ch=='F') || (ch=='G') || (ch=='H') || (ch=='K') || (ch=='L') || (ch=='M') || (ch=='N') || (ch=='P') || (ch=='Q') || (ch=='R') || (ch=='S') || (ch=='T') || (ch=='V') || (ch=='W') || (ch=='X') || (ch=='Y') || (ch=='Z')))
{KillList(list); F=1;}
else
if (F==0) Add(list, ch);

};
}
} else printf("error output file\n\r");
}
else printf("error input file\n\r");
//конец поиска

cout<<'\n';

//ищет числа и считает их сумму
list=NULL;
sum=0;
summa=0;
if( (fopen_s( &FI, "input.txt", "r" )) == 0 )
{
if( (fopen_s(&FO2 , "output2.txt", "w+" )) == NULL )
{
F=0;
while (!feof(FI))
{
fread( &ch,1,1,FI );
a=ch;
if (ch==' ')
{
F=0;
if (list!=NULL) { Print(list); summa=summa+sum; fwrite(&list,5,5,FO2); cprintf(" "); KillList(list); };
}
else
{
if (!((ch>='0') && (ch<='9')))
{KillList(list); sum=0; F=1;}
else
if (F==0) {Add(list, ch); sum=sum+a;}

};
}
} else printf("error output file\n\r");
//конец поиска
}
else printf("error input file\n\r");
cout<<'\n';
printf("close %i files",_fcloseall());
cout<<"\nsumma="<<summa;

getch();
return 0;
}
=========================
Три файла хранятся в подпапке с названием, как у самого проекта. Я пользуюся Visual Studio 9.

У меня возникла сложность в копировании из списка этих самых регулярных слов и чисел в файлы, там копируется, но какая-то фигня. И когда подсчитывается сумма чисел в первом файле, то считается сумма номеров в аски таблице, а не самого числа. Помогите, очень надо!

Модератор: тег CODE, а не CODEBOX
МОЙ САЙТ
Компьютер позволяет решать все те проблемы, которые до появления компьютера не существовали.

Последний раз редактировалось MaTBeu; 21.01.2009 в 17:16.
xDyPx вне форума Ответить с цитированием
Старый 21.01.2009, 21:50   #2
counter
Участник клуба
 
Регистрация: 18.10.2008
Сообщений: 1,409
По умолчанию

сумму вроде надо так.
Ты читаеш из файла в чар, поэтому надо его приводить к инту
Код:
 sum=sum+(int)a;
counter вне форума Ответить с цитированием
Старый 21.01.2009, 23:14   #3
xDyPx
Форумчанин
 
Аватар для xDyPx
 
Регистрация: 21.01.2009
Сообщений: 148
По умолчанию

До меня доперло, что я сумму неправильно считал. Получается мне нужно "сложить содержимое списка с числом", т.е. список содержит цифры, которые образуют число и надо это самое число сложить с другим числом(по моей программе с summa). Вот это как сделать?!?!?

Но это вторая часть задания, и первая меня интересует не меньше.

Вообщем есть список, в нем символы, нужно эти символы скопировать в файл! КАК???? fputc, fprintf, fgets - заносят в файл какую-то фигню, причем одну и ту же! Может я их не правильно использовал? Хотя я могу сдержимое списка вывести на экран и выводицца все нормульно!!!
МОЙ САЙТ
Компьютер позволяет решать все те проблемы, которые до появления компьютера не существовали.
xDyPx вне форума Ответить с цитированием
Старый 22.01.2009, 00:00   #4
counter
Участник клуба
 
Регистрация: 18.10.2008
Сообщений: 1,409
По умолчанию

вот этой штукой

Код:
 fwrite(&list,sizeof(list),1,FO)
ты пишеш файл в бинарном режиме поэтому иам и будут кракозябры!

а как ты вызываеш FPrint(node* head) я чето в тексте и не обнаружил
counter вне форума Ответить с цитированием
Старый 22.01.2009, 00:21   #5
xDyPx
Форумчанин
 
Аватар для xDyPx
 
Регистрация: 21.01.2009
Сообщений: 148
По умолчанию

Цитата:
Сообщение от counter
а как ты вызываеш FPrint(node* head) я чето в тексте и не обнаружил
В том тексте, что я разместил, его нет, но сам его использовать я пробовал, где
Код:
if (list!=NULL) { Print(list); fwrite(&list,sizeof(list),1,FO); cprintf(" "); KillList(list); };
вместо того самого
Код:
fwrite(&list,sizeof(list),1,FO)
но все равно эти кракозябры.
Так fwrite должен помочь, или сам файл для записи открывать по-другому надо?


Модератор: для кода нужен тег CODE а не QUOTE
МОЙ САЙТ
Компьютер позволяет решать все те проблемы, которые до появления компьютера не существовали.

Последний раз редактировалось MaTBeu; 22.01.2009 в 12:02.
xDyPx вне форума Ответить с цитированием
Старый 22.01.2009, 13:38   #6
counter
Участник клуба
 
Регистрация: 18.10.2008
Сообщений: 1,409
По умолчанию

а вот так делал?
Код:
fprintf(FO,"%c",temp->key);
или может выкинь весь код - посмотрим
counter вне форума Ответить с цитированием
Старый 22.01.2009, 15:15   #7
xDyPx
Форумчанин
 
Аватар для xDyPx
 
Регистрация: 21.01.2009
Сообщений: 148
По умолчанию

Весь код(рабочий):

Код:
// lab4.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <conio.h>
#include <stdio.h>
#include <iostream>
using namespace std;
#include <stdlib.h>
#include <math.h>


struct node
   {
       char key;					//перемнная в поле
	   node* next;					// указатель на следующий элемент
	};

//добавление в список нового элемента
void Add(node* &head, char k)		//используются список head и переменная К
	{
	 if (head==NULL)				//если списка нет
	 {
	    head=new node;				// создается новый элемент
		head->key=k;				// в новом элементе хранится знач кеу=к
		head->next=NULL;			//элемент указывает на конец спмска
 	 }
	 else							//если список есть
	 {
	  node* temp=head;				//объявляется перременная
	  while (temp->next !=NULL)     //пока ссылка на следующий элемент существует..
		temp=temp->next;            //переходить на следующий элемент
	  temp->next=new(node);			//если не сущ. следующего элемента, создать его
	  temp=temp->next;				//в переменную Темр присваивается значение следующей переменной
	  temp->key=k;					//заполняет его
	  temp->next=NULL;				//следующей переменной не сущечтвует 
	 }
	}

//вывод на печать список
void Print(node* head)
	{
	  node* temp=head;
	  while (temp !=NULL)			 // пока не конец списка...
	  {
		printf("%c",temp->key);		 //..выводить элемент..
		temp=temp->next;			 //.. и переходить на следующий
	 }
	}

void FPrint1(node* head)
	{
	  FILE *FO;
	  node* temp=head;
	  if( (fopen_s(&FO  , "output1.txt", "a+" )) == NULL )
	   {
	   while (temp !=NULL)								 // пока не конец списка...
	   {
		 fprintf(FO,"%c",temp->key);
		 temp=temp->next;			 //.. и переходить на следующий
	   }
	  }
	 fprintf(FO,"%c",32);
	 fclose(FO);
	}

void FPrint2(node* head)
	{
	  FILE *FO2;
	  node* temp=head;
	  if( (fopen_s(&FO2  , "output2.txt", "a+" )) == NULL )
	   {
	   while (temp !=NULL)								 // пока не конец списка...
	   {
        fprintf(FO2,"%c",temp->key);
		temp=temp->next;			 //.. и переходить на следующий
	   }
	  }
     fprintf(FO2,"%c",32);
     fclose(FO2);
	}

//очистка списка
void KillList(node* &head)
	{
       if (head==NULL) return;		 //если список пуст, ничего не делать
	   KillList(head->next);		 //удаляется следующий элемент
	   delete head ;				 //удаляется на него ссылка..
	   head=NULL;					 //..и указывается ссылка на конец списка
	  
	}

int _tmain(int argc, _TCHAR* argv[])
{
	node* list=NULL;
	char ch;
	int F;
	char c=' ';
    FILE *FI, *FO, *FO2; 

//поиск регулярных слов
	if( (fopen_s( &FI, "input.txt", "r" )) == 0 )
	 {
		//if( (fopen_s(&FO  , "output1.txt", "w+" )) == NULL )
	     //{
           F=0;
		   while (!feof(FI))
		    {
              fread( &ch,1,1,FI );
			  if (ch==' ')
			   {
				   F=0;
				   if (list!=NULL) { Print(list); FPrint1(list); cprintf(" "); KillList(list); };
			   }
			  else
			   { 
				   if (!((ch=='B') || (ch=='C') || (ch=='D') || (ch=='F') || (ch=='G') || (ch=='H') || (ch=='K') || (ch=='L') || (ch=='M') || (ch=='N') || (ch=='P') || (ch=='Q') || (ch=='R') || (ch=='S') || (ch=='T') || (ch=='V') || (ch=='W') || (ch=='X') || (ch=='Y') || (ch=='Z')))
				    {KillList(list); F=1;}
				   else
				    if (F==0) Add(list, ch);
				   
			   };
		    }
		// } else printf("error output file\n\r");
		}
	else printf("error input file\n\r");
//конец поиска

cout<<'\n';

//ищет числа и считает их сумму
list=NULL;
int sum;
int summa;
char a;
sum=0;
summa=0;
if( (fopen_s( &FI, "input.txt", "r" )) == 0 )
	 {
	   //if( (fopen_s(&FO2  , "output2.txt", "w+" )) == NULL )
	     //{
           F=0;
		   while (!feof(FI))
		    {
              fread( &ch,1,1,FI );
			      a=ch;
		    	  if (ch==' ')
			   {
				   F=0;
				   if (list!=NULL) { Print(list); summa=summa; FPrint2(list); cprintf(" "); KillList(list); };
			   }
			  else
			   { 
				   if (!((ch>='0') && (ch<='9')))
				     {KillList(list); F=1;}
				   else
					   if (F==0) Add(list, ch);
				   
			   };
		    }
		 //} else printf("error output file\n\r");
    //конец поиска	
	}
	else printf("error input file\n\r");
	 cout<<'\n';
    printf("close %i files",_fcloseall());
	cout<<"\nsumma="<<summa;

	getch();
	return 0;
}
Вобщем я ставил,
Код:
fprintf(FO, "%lf", temp->key);
а надо было как ты написал
Код:
fprintf(FO,"%c",temp->key);
Отличается всего лишь парой символов! Теперь добавляет нормально в файлы все.
Спасибо огромное, counter!
Теперь осталось с суммой только разобраться, мне нужно "сложить содержимое списка с числом", т.е. список содержит цифры, которые образуют число и надо это самое число сложить с другим числом(по моей программе с summa). Вот это как сделать?!?!? Ни малейшего представления не имею!
МОЙ САЙТ
Компьютер позволяет решать все те проблемы, которые до появления компьютера не существовали.

Последний раз редактировалось xDyPx; 22.01.2009 в 15:51.
xDyPx вне форума Ответить с цитированием
Старый 23.01.2009, 02:26   #8
counter
Участник клуба
 
Регистрация: 18.10.2008
Сообщений: 1,409
По умолчанию

когда читаеш символы из файла отнимай от их кода 48

Код:
summa=0;
 while (!feof(FI)) {
char ch;
fread(&ch,1,1,FI);
ch-=48;
summa+=ch;
}
вроде должно работать
counter вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Скопировать занятый системный файл Alter Софт 6 31.12.2010 14:01
скопировать во второй файл слова которые начинаются и заканчиваются на одну букву Екатерина А. Паскаль, Turbo Pascal, PascalABC.NET 2 23.12.2008 15:08
запись в файл из списка на Си sashaforever Общие вопросы C/C++ 1 12.05.2008 18:24
Каким образом скопировать файл? Kashp Общие вопросы Delphi 14 07.08.2007 11:44
как скопировать файл Scorpeon Общие вопросы Delphi 1 19.04.2007 13:45