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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 20.05.2009, 17:53   #11
Nitrino
Я ещё только учусь
Форумчанин
 
Регистрация: 06.05.2009
Сообщений: 158
По умолчанию

Ещё один может быть детский вопрос почему fscanf считывает только до пробела? а остальное не хочет
Например
Код:
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <conio.h>

//------------------------------------------------

void main (void)
{
clrscr();
char str[100];
char s[100];
FILE *fp;
int i;

fp = fopen("1.txt", "w+t");
gets(s);
fprintf(fp,"%s",s);
fseek(fp,0,SEEK_SET);
fscanf(fp,"%s",str);
puts(str);
fclose(fp);
getch();
}
Если вводим Hello World, то программа правильно записывает в файл, а после чтения puts выводит на экран только Hello
Nitrino вне форума Ответить с цитированием
Старый 20.05.2009, 18:12   #12
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Потому что разделителем является любой пробельный символ. Если вам нужны пробелы, то используйте fgets.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 20.05.2009, 18:39   #13
Nitrino
Я ещё только учусь
Форумчанин
 
Регистрация: 06.05.2009
Сообщений: 158
По умолчанию

Если ещё не достал скажите, каким образом можно произвести чтение из файла, а не из самого потока? т.е дан файл с текстом как считать содержимое этого файла, а функции fgets и fscan на сколько я понял считывают только из патока
Nitrino вне форума Ответить с цитированием
Старый 20.05.2009, 18:45   #14
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Какого потока? fgets и fscanf считывают данные из файла, на который указывает соответствующий указатель.

Содержимое файла можно считать разными способами. Например, посимвольно (fgetc, fscanf), построчно (fgets, fscanf), поблочно (fread).
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 20.05.2009, 19:14   #15
Nitrino
Я ещё только учусь
Форумчанин
 
Регистрация: 06.05.2009
Сообщений: 158
По умолчанию

Вот программа
Код:
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <conio.h>
#include <string.h>

//------------------------------------------------

void main (void)
{
clrscr();
char str[100];
FILE *fp;
int i;

fp = fopen("1.txt", "rt");
fseek(fp,0,SEEK_SET);
fputs(str,fp);
puts(str);
fclose(fp);


getch();
}
Почему она считывает из файла непонятные символы вместо нужной строки?
Nitrino вне форума Ответить с цитированием
Старый 20.05.2009, 19:17   #16
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Цитата:
Почему она считывает из файла непонятные символы вместо нужной строки?
Она у вас вообще ничего не считывает.
Вместо fputs запишите:
Код:
fgets(str,100,fp);
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 21.05.2009, 18:40   #17
Nitrino
Я ещё только учусь
Форумчанин
 
Регистрация: 06.05.2009
Сообщений: 158
По умолчанию

Помогите пожалуйста со списками
создаю структуру
Код:
struct str
  {
	char len[1000];//сама строка
	int  num;//номер строки
	str *next;
  };
Как должна выглядеть программа в который будет осуществляться двусвязный список элементом которого будет являться строка
считанная из файла.
Помогите, а то я что то не могу это понять
Nitrino вне форума Ответить с цитированием
Старый 21.05.2009, 19:01   #18
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Посмотрите пример вот тут:
http://programmersforum.ru/showthread.php?t=49959
Там односвязный список.

Вам нужно сделать функции добавления и удаления элемента.
Если у вас двусвязный список, то сама структура должна выглядеть примерно так:
Код:
struct str
  {
	char len[1000];//сама строка
	int  num;//номер строки
	str *next;
           str *pred;
  };
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 23.05.2009, 15:53   #19
Nitrino
Я ещё только учусь
Форумчанин
 
Регистрация: 06.05.2009
Сообщений: 158
По умолчанию

Помогите подредактировать программу, то что то я не могу разобраться что не так
Код:
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>

struct node
{
  int str[1000];
  node *sled;
  node *pred;
};

//-----------------------------------------------------------------------
void Postroenie (node *nsp, node *ksp)
//Построение двунаправленного списка:
// nsp - указатель на начало списка,
// ksp - указатель на конец списка.
{
  node *rsp;
  char el;

  nsp = new(node);
  rsp = nsp;
  (*nsp).pred = NULL; (*nsp).sled = NULL;
  printf("Вводите строки:\n");
  scanf("%s", el);
  while  (el!=0)
  {
    (*rsp).sled = new(node);
    (*((*rsp).sled)).pred = rsp; rsp = (*rsp).sled;
    (*rsp).sled = NULL; (*rsp).str = el;
    scanf("%s", el);
  }
  ksp = rsp;
}

void VyvodForward (node *nsp, node *ksp)
//Вывод содержимого двунаправленного списка.
{
  node *rsp;
  rsp = (*nsp).sled;
  printf("Двунаправленный список содержит: ");
  while  (rsp!=NULL)
  {
    printf(" %s", (*rsp).str); rsp = (*rsp).sled;
  }
  printf("%s", ksp);
}

node *PoiskStr (int el,node *nsp)
//Функция возвращает указатель на найденный элемент el
{
  node   *q;
  node *Res;

  Res = NULL; q = (*nsp).sled;
  while  (q!=NULL && Res==NULL)
    if  ((*q).str==el) Res = q;
    else  q = (*q).sled;
  return Res;
}


void InsAfter (int el,node *Res, node *ksp)
//Вставка звена с информационным полем el
{
  node *q;

  q = new(node);
  (*q).str = el;
  if  ((*Res).sled!=NULL)
  {
    (*q).sled = (*Res).sled;
    (*q).pred = (*(*Res).sled).pred;
    (*(*Res).sled).pred = q; (*Res).sled = q;
  }
  else
  {
    (*q).sled = NULL;
    (*q).pred = Res; ksp = q; (*Res).sled = q;
  }
}

void Delete (node *Res, node *ksp)
//Удаление звена из двунаправленного списка.
{
  if  ((*Res).sled!=NULL)
  {
     (*(*Res).sled).pred = (*Res).pred;
     (*(*Res).pred).sled = (*Res).sled;
     delete Res;
  }
  else
  {
    (*(*Res).pred).sled = NULL; ksp = (*ksp).pred;
    delete Res;
  }
}

void Ochistka (node *nsp, node *ksp)
//Удаление двунаправленного списка из памяти.
{
  node *q,*q1;

  q  = nsp; q1 = (*q).sled;
  while  (q1!=NULL)
  {
    q = q1; q1 = (*q1).sled; delete q;
  }
  delete nsp; nsp = ksp = NULL;
}


//-----------------------------------------------------------------------

void main ()
{
  node *Res, *nsp, *ksp;
  char el[1000],el1[1000];


  printf("Введите строку, после которой осуществляется вставка: ");
  scanf("%s", el);
  printf("Введите вставляемую строку: ");
  scanf("%s", el1);
  Res=PoiskStr (el, nsp);
  if  (Res!=NULL)
    {
      InsAfter (el1, Res, ksp);
      VyvodForward (nsp, ksp);
    }

  printf("Введите строку, которую надо удалить: ");
  scanf("%s", el);
  Res = PoiskStr (el, nsp);
  if  (Res!=NULL)
  {
    Delete (Res);
    VyvodForward (nsp, ksp);
  }
  else  printf("Такой строки нет!\n");

  Ochistka (nsp, ksp);
}
Nitrino вне форума Ответить с цитированием
Старый 23.05.2009, 19:16   #20
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

В структуре:
Код:
int str[1000];
массив чисел. А сравниваете с символом:
Код:
  (*q).str = el;
и так везде.

Тут:
Код:
 Delete (Res);
должно быть 2 параметра.

Переменная el у вас то char, то int.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Десятичные дроби в двоичном виде Ukrajinec Помощь студентам 2 13.04.2009 11:29
хранение данных в файле (dc++) AsabeasT Общие вопросы Delphi 2 27.03.2009 11:57
Поиск определённого текста в текстовом файле vitawt Общие вопросы Delphi 4 20.01.2008 22:12
Как правильно сохранить настройки текста в ini файле KORN Общие вопросы Delphi 2 30.10.2007 09:14
Поиск и замена текста в файле VAbramyak Общие вопросы Delphi 3 04.04.2007 20:20