2014 dxdy logo

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

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




 
 Файлы в С++
Сообщение05.10.2009, 18:11 
Задача элементарная :)
Цитата:
Сведения об учениках состоят из его имени, фамилии, номера и буквы класса. Дан файл, который содержит сведения об учениках. Определить, есть ли в школе ученики с одинаковой фамилией.

Написал такую программу
код: [ скачать ] [ спрятать ]
Используется синтаксис 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 
Аватара пользователя
Trius в сообщении #249289 писал(а):
while ((b==0)&(j<=n)) ;

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

 
 
 
 Re: Файлы в С++
Сообщение05.10.2009, 18:32 
Спасибо, переписал немного код
код: [ скачать ] [ спрятать ]
Используется синтаксис 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 
Проверка if (p1.surname==p.surname) по-моему абсурдна, ибо вы просто сравниваете указатели, а не сами строки. Используйте, например, strcmp(...).

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

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


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

 
 
 
 Re: Файлы в С++
Сообщение05.10.2009, 18:42 
Аватара пользователя
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 
А почему тема называется "Файлы в С++" когда С++ тут и не пахнет?

 
 
 
 Re: Файлы в С++
Сообщение05.10.2009, 18:47 
venco в сообщении #249305 писал(а):
когда С++ тут и не пахнет?
Ну как же, а <iostream.h>? :)

 
 
 
 Re: Файлы в С++
Сообщение05.10.2009, 18:47 
2venco
Цитата:
А почему тема называется "Файлы в С++" когда С++ тут и не пахнет?

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

 
 
 
 Re: Файлы в С++
Сообщение05.10.2009, 21:51 
Circiter в сообщении #249302 писал(а):
P.S.: Ужасный код!

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

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

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

 
 
 
 Re: Файлы в С++
Сообщение05.10.2009, 23:46 
Цитата:
Потому, что я не знаю, чем С++ отличается от С

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

Цитата:
Цитата:
Да ещё не видно как доступ к пространству имен 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 
Trius в сообщении #249346 писал(а):
Потому, что я не знаю, чем С++ отличается от С
Язык C++ основан на C - операция инкремента появилась в названии не зря; вот этот-то инкремент наиболее важен. Самое главное отличие - поддержка концепции объектно-ориентированного проектирования, встроенная в язык (то, что некоторые называют синтаксическим сахаром, хотя любой язык программирования - это синтаксический сахар). Встроенность заключается в том, что программисту нет необходимости заботиться о деталях поддержки этой концепции. Над основой - ООП - надстроены такие возможности, как шаблоны, перекрытие операций, условно встроенная в язык поддержка ввода/вывода - потоки. Впрочем, потоки - более объемлющий механизм, чем I/O.

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

 
 
 
 Re: Файлы в С++
Сообщение06.10.2009, 12:36 
Правильнее сказать, что Си оставлен в Си++ как подмножество, исключительно из соображений совместимости с гигатоннами исходников, написанных на чистом Си. Отсюда множество проблем кстати - синтаксис Си уже был довольно ужасен, а Си++ раздул это до неимоверного уровня.

 
 
 [ Сообщений: 12 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group