2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 Файлы в С++
Сообщение05.10.2009, 18:11 


03/02/07
254
Киев
Задача элементарная :)
Цитата:
Сведения об учениках состоят из его имени, фамилии, номера и буквы класса. Дан файл, который содержит сведения об учениках. Определить, есть ли в школе ученики с одинаковой фамилией.

Написал такую программу
код: [ скачать ] [ спрятать ]
Используется синтаксис C++
#include <stdio.h>
#include <string.h>
#include <iostream.h>
#define false 0
#define true 1

typedef struct
{ char name[20];
char surname[20];
unsigned klass;
char form[1];
} pupil;
char fname[81]="n:\\files\\pupil.txt";

void input(int n)
{
 pupil p;
 int i;
 FILE *fp;
 fp=fopen(fname,"w+b");
   for (i=1;i<=n;i++)
   {
   cout<<"Input "<<i<<" name ";
   gets(p.name);
   cout<<"Input "<<i<<" surname ";
   gets(p.surname);
   cout<<"Input "<<i<<" class ";
   cin>>p.klass;
   cout<<"Input "<<i<<" form ";
   gets(p.form);
   fwrite(&p,sizeof(p),1,fp)  ;
   }
 fclose(fp);
}

void search(int n)
{
  pupil p1,p;
  int i,j;
  bool b;
  FILE *fp;

  fp=fopen(fname,"r+b");
  b=0;

  i=0;
  while ((b==0)&(i<=n))
   { i++;
      fseek(fp, (i-1)*sizeof(p), SEEK_SET)      ;
      fread(&p,sizeof(p),1,fp);
     
      j=i;
        cout<<"1";
    while ((b==0)&(j<=n)) ;
    { j++;
    fread(&p1,sizeof(p1),1,fp);
     
    if (p1.surname==p.surname)   b=1;
    }

  if (b==1)
    cout<<"There are pupils with same surname in the school\n";
    else cout<<"There are no pupils with same surname in the school\n";
   }
   fclose(fp);
}

void main()
{
int n;
cout<<"Input n";
cin>>n;
input(n);
search(n);
}

Заполнение файла проходит нормально, а на процедуре search зацикливает. В упор не вижу ошибки :(

 Профиль  
                  
 
 Re: Файлы в С++
Сообщение05.10.2009, 18:17 
Заслуженный участник
Аватара пользователя


03/06/09
1497
Trius в сообщении #249289 писал(а):
while ((b==0)&(j<=n)) ;

уберите точку с запятой вконце

 Профиль  
                  
 
 Re: Файлы в С++
Сообщение05.10.2009, 18:32 


03/02/07
254
Киев
Спасибо, переписал немного код
код: [ скачать ] [ спрятать ]
Используется синтаксис C++
#include <conio.h>
#include <stdio.h>
#include <string.h>
#include <iostream.h>
#define false 0
#define true 1

typedef struct
{ char name[20];
char surname[20];
unsigned klass;
char form[1];
} pupil;
char fname[81]="n:\\files\\pupil.txt";

void input(int n)
{
 pupil p;
 int i;
 FILE *fp;
 fp=fopen(fname,"w+b");
   for (i=1;i<=n;i++)
   {
   cout<<"Input "<<i<<" name ";
   gets(p.name);
   cout<<"Input "<<i<<" surname ";
   gets(p.surname);
   cout<<"Input "<<i<<" class ";
   cin>>p.klass;
   cout<<"Input "<<i<<" form ";
   gets(p.form);
   fwrite(&p,sizeof(p),1,fp)  ;
   }
 fclose(fp);
}

bool search(int n)
{
  pupil p1,p;
  int i,j;
  bool b;
  FILE *fp;

  fp=fopen(fname,"r+b");
  b=0;
  i=0;
  while ((b==0)&(i<=n))
   { i++;
      fseek(fp, (i-1)*sizeof(p), SEEK_SET);
      fread(&p,sizeof(p),1,fp);
      if (feof(fp)) break;
      j=i;
      while ((b==0)&(j<=n))
        { j++;
       fread(&p1,sizeof(p1),1,fp);
       if (feof(fp)) break;
      if (p1.surname==p.surname)   b=1;
       }

   }
     fclose(fp);
     return b;
}

void main()
{
int n; bool b;
cout<<"Input n";
cin>>n;
input(n);
b=search(n);
switch(b)
  {
  case 1:cout<<"There are pupils with same surname in the school\n"; break;
  case 0:cout<<"There are no pupils with same surname in the school\n"; break;
  }
getch();
}

Теперь не выводит "There are pupils with same surname in the school" даже если есть совпадающие фамилии(

 Профиль  
                  
 
 Re: Файлы в С++
Сообщение05.10.2009, 18:40 
Заслуженный участник


26/07/09
1559
Алматы
Проверка if (p1.surname==p.surname) по-моему абсурдна, ибо вы просто сравниваете указатели, а не сами строки. Используйте, например, strcmp(...).

Правильно сделали, что вынесли проверку b за пределы цикла.

Зачем вам #define false 0 и
#define true 1 ???


P.S.: Ужасный код!

 Профиль  
                  
 
 Re: Файлы в С++
Сообщение05.10.2009, 18:42 
Заслуженный участник
Аватара пользователя


03/06/09
1497
Trius в сообщении #249300 писал(а):
while ((b==0)&(i<=n))

Здесь (и в других подобных местах) должно быть "&&", а не "&".

P. S. Пользуйтесь отладчиком. Вы, по всей вилдимости, пользуетесь вижулом, так там отладчик встроен в IDE.
P. S. Правильней прототип для main() в вашем случае записать
Код:
int main(void)
И конечно return поставить вконце функци. Для либерального вижуала это не ошибка, но мой g++ наотрез отказался компилировать такое вольное определение main().

 Профиль  
                  
 
 Re: Файлы в С++
Сообщение05.10.2009, 18:42 
Заслуженный участник


04/05/09
4582
А почему тема называется "Файлы в С++" когда С++ тут и не пахнет?

 Профиль  
                  
 
 Re: Файлы в С++
Сообщение05.10.2009, 18:47 
Заслуженный участник


09/08/09
3438
С.Петербург
venco в сообщении #249305 писал(а):
когда С++ тут и не пахнет?
Ну как же, а <iostream.h>? :)

 Профиль  
                  
 
 Re: Файлы в С++
Сообщение05.10.2009, 18:47 
Заслуженный участник


26/07/09
1559
Алматы
2venco
Цитата:
А почему тема называется "Файлы в С++" когда С++ тут и не пахнет?

Ну автор написал cout и доволен. :) Да ещё не видно как доступ к пространству имен std осуществляется.

 Профиль  
                  
 
 Re: Файлы в С++
Сообщение05.10.2009, 21:51 


03/02/07
254
Киев
Circiter в сообщении #249302 писал(а):
P.S.: Ужасный код!

знаю)
venco в сообщении #249305 писал(а):
А почему тема называется "Файлы в С++" когда С++ тут и не пахнет?

Потому, что я не знаю, чем С++ отличается от С :roll:
Цитата:
Да ещё не видно как доступ к пространству имен std осуществляется.

А что это? И зачем?
PS: всем спасибо за помощь!

 Профиль  
                  
 
 Re: Файлы в С++
Сообщение05.10.2009, 23:46 
Заслуженный участник


26/07/09
1559
Алматы
Цитата:
Потому, что я не знаю, чем С++ отличается от С

Отличий очень много, сравните стандарты. :)

Цитата:
Цитата:
Да ещё не видно как доступ к пространству имен std осуществляется.

А что это? И зачем?

Ну объекты-потоки из STL вроде cout, cin, и т.д., помещены в вышеупомянутое пространство имен из соображений сохранения модульности. В учебных программах перед использованием таких вещей можно написать например using namespace std. Но на самом деле так делать нельзя, лучше писать в конкретной области видимости using std::cout, например. А в реальных программах лучше обходиться без таких приемов и писать что-то вроде std::cout << "msg" << std::endl. Странно, что у вас это работает по-умолчанию... У вас очень странный компилятор... :)

Ещё одно замечание: так сохранять данные в файлы нельзя. Это абсолютно непортабельное решение. Нужно работать с данными так, чтобы быть уверенным в том, как именно они физически будут расположены в файле, в частности, нельзя напрямую сбрасывать дампы структур на диск. Лучше написать разные функции для записи строки в файл, для записи 32-х разрядного беззнакового тупоконечного целого числа, и т.д. Т.е. нужно точно знать сколько вы данных записали, и как они организованы.

В вашем же случае реальные размеры полей и размеры всей структуры (записи) могут сильно варьироваться даже просто на одной и той же машине в зависимости от компилятора или даже просто от его настроек. В каком именно порядке хранятся байты в целых числах вы тоже не знаете, сколько места занимает число тоже неизвестно... Велик риск, что данные записанные вашей программкой на одном компьютере не смогут быть прочитанными на другом. Ну думаю проблема ясна. :)

Учите C++, для начала можно прочитать книжку B.Stroustrup, The C++ Programming Language. :)

-- Вт окт 06, 2009 02:48:02 --


 Профиль  
                  
 
 Re: Файлы в С++
Сообщение06.10.2009, 01:42 
Заслуженный участник


15/05/09
1563
Trius в сообщении #249346 писал(а):
Потому, что я не знаю, чем С++ отличается от С
Язык C++ основан на C - операция инкремента появилась в названии не зря; вот этот-то инкремент наиболее важен. Самое главное отличие - поддержка концепции объектно-ориентированного проектирования, встроенная в язык (то, что некоторые называют синтаксическим сахаром, хотя любой язык программирования - это синтаксический сахар). Встроенность заключается в том, что программисту нет необходимости заботиться о деталях поддержки этой концепции. Над основой - ООП - надстроены такие возможности, как шаблоны, перекрытие операций, условно встроенная в язык поддержка ввода/вывода - потоки. Впрочем, потоки - более объемлющий механизм, чем I/O.

Именно о потоках имеет смысл говорит в контексте темы "Файлы в С++", поскольку в языке C собственно ввод/вывод не поддерживается - это возлагается на библиотеку времени исполнения (RTL), хотя определенные соглашения по названию библиотечных функций в/в имеются.

 Профиль  
                  
 
 Re: Файлы в С++
Сообщение06.10.2009, 12:36 


21/03/06
1545
Москва
Правильнее сказать, что Си оставлен в Си++ как подмножество, исключительно из соображений совместимости с гигатоннами исходников, написанных на чистом Си. Отсюда множество проблем кстати - синтаксис Си уже был довольно ужасен, а Си++ раздул это до неимоверного уровня.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 12 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group