2014 dxdy logo

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

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




Начать новую тему Ответить на тему На страницу Пред.  1, 2
 
 Re: Продолжение темы с записной книжкой. Си.
Сообщение23.11.2013, 18:55 
Заслуженный участник


09/09/10
3729
shukshin в сообщении #791785 писал(а):
вот со спецификаторами здесь тоже можно было бы уточнить, честно говоря, никогда этим не пользовался...

" %9s %9s %19s \n" описывает строку следующего вида: любое (в т.ч. и нулевое) количество пробелов, строка из не более чем 9 непробельных символов, любое число пробелов, строка из не более чем 9 непробельных символов, любое число пробелов, строка из не более чем 19 непробельных символов, любое число пробелов, перевод строки.

shukshin в сообщении #791785 писал(а):
Ну вот еще не понимаю откуда define size_t берется?

size_t — стандартный целочисленный тип без знака, определен в <stddef.h> (виден из <stdlib.h>, если я правильно помню), который гарантировано может вместить размер любого объекта в памяти и, как следствие, любой индекс в массиве.

 Профиль  
                  
 
 Re: Продолжение темы с записной книжкой. Си.
Сообщение23.11.2013, 19:04 
Заслуженный участник


27/04/09
28128
А ещё вот результаты с первой страницы поиска в Google fscanf и scanf с подробным описанием строки формата: раз, два.

 Профиль  
                  
 
 Re: Продолжение темы с записной книжкой. Си.
Сообщение23.11.2013, 19:23 
Заслуженный участник
Аватара пользователя


06/10/08
6422
shukshin в сообщении #791785 писал(а):
со спецификаторами здесь тоже можно было бы уточнить, честно говоря, никогда этим не пользовался...
Ну прочитайте Вы наконец Кернигана-Ритчи. В новом издании спецификаторы в параграфах 7.2 и 7.4 описываются.

 Профиль  
                  
 
 Re: Продолжение темы с записной книжкой. Си.
Сообщение23.11.2013, 19:33 
Заслуженный участник


09/09/10
3729

(Оффтоп)

Честно говоря, scanf мне всегда нравился больше std::istream — у него же строка формата представляет собой урезанную версию регулярных выражений с более вменяемым/читаемым синтаксисом. Другое дело, что типобезопасность там не на высоте...

 Профиль  
                  
 
 Re: Продолжение темы с записной книжкой. Си.
Сообщение24.11.2013, 00:39 
Заслуженный участник


28/04/09
1933

(Joker_vD)

Самое забавное, что представители семейства *scanf/*printf не только удобнее использовать, но они еще и работают быстрее классов std::*stream, несмотря на дополнительные временные затраты по разбору строки формата.
Что касается типобезопасности, то в последнем стандарте на данном фронте наметились два прорыва. Во-первых, появилось новое семейство функций v*scanf/v*printf, которые получают на вход (помимо форматной строки) объекты класса va_list. Над этими функциями легко писать собственные обертки. Во-вторых, введение механизма variadic templates позволяет создавать собственные типобезопасные функции ввода/вывода со строкой формата.

 Профиль  
                  
 
 Re: Продолжение темы с записной книжкой. Си.
Сообщение24.11.2013, 18:59 


20/10/12
235
Все равно упрямится - не работает :? Вот такой вот общий код(пока что qsort не подключен)
код: [ скачать ] [ спрятать ]
Используется синтаксис C++
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#define SIZE 200
#define BUFF 10000
#define MODBUFFER 10
/*Количество имен 200 x (10 + 10 + 20 ) = 8000*/
/*Записная книга*/

int modecorrect(char *str); /*Прототипы*/ /*Проверка упр. строки*/
int getdata(unsigned char *field, FILE *file); /*Получение данных формы*/

struct person{                                 /*Структура записи*/
  unsigned char name[10];
  unsigned char surname[10];
  unsigned char number[20];
};

int main(void)
{
FILE *MyBook;
unsigned int i, count; //for initializing structure
struct person NewData;
struct person Contacts[SIZE]; /*Массив структур*/
unsigned char *out = malloc(BUFF * sizeof(unsigned char));
/*указатель в файле при выводе и сортировке*/
unsigned char *pname    = NewData.name;          
unsigned char *psurname = NewData.surname;
unsigned char *pnumber  = NewData.number;

unsigned char *mode     = malloc(MODBUFFER * sizeof(unsigned char)); /* Read or Add */
unsigned char *answer   = malloc( 4 * sizeof(unsigned char));        /* YES / NO */

printf("MyBook 1.0\nEnglish language is used(!) \nChoose your mode:");
while(1){ //// !!!!!Начало общего зацикливания
printf("\nInput \"Read\" or \"Add\"\n");
gets(mode);

if(!strcmp(mode,"Add")) /*Режим добавления*/
{
if((MyBook = fopen("MyBook.txt", "a+")) == NULL)//
printf("Writing MyBook.txt error");

printf("Please, input new data\nto stop press <Enter>\n");
while(1){//////////////////
printf("Name: ");
 getdata(pname, MyBook);
fprintf(MyBook, " ");
if(!strcmp(pname, ""))
 break;

printf("Surname: ");
 getdata(psurname, MyBook);
fprintf(MyBook, " ");

printf("Number: ");
 getdata(pnumber, MyBook);
fprintf(MyBook, "\n");
}//////////////////////////
fclose(MyBook);
}
/* Режим чтения и сортировки */
if(!strcmp(mode,"Read"))
{
if((MyBook = fopen("MyBook.txt", "r")) == NULL)
printf("Reading MyBook.txt error");
do{
fscanf(MyBook, "%c" , out);
putchar(*out);
}while(!feof(MyBook));

do{
printf("\n Alphabet sort? Input \"Yes\" or \"No\" ");
gets(answer);
}while(strcmp(answer, "Yes") && strcmp(answer, "No"));

if(!strcmp(answer, "Yes"))
{
    count = fillStruct(MyBook, Contacts[SIZE], SIZE ); //заполняем структуру из файла
    printf("%u", count);
    for (i = 0; i < count; ++i)
       printf("%s %s %s \n", Contacts[i].name, Contacts[i].surname, Contacts[i].number);
}

fclose(MyBook);
}

////////////// QSORT //////////////////
} ////!!!!
return 0;
}
        /* small functions */
int modecorrect(char *str)  
{
if(!strcmp(str, "Add") || !strcmp(str, "Read"))
 return 1;
return 0;
}
int getdata(unsigned char *field, FILE *file)
{
gets(field);
fputs(field, file);
return;
}
////////////////////// ФУНКЦИИ ДЛЯ СОРТИРОВКИ ПО АЛФАВИТУ //////////////////////////
int qsort(struct person *left, int allnumber, int (*compare)(struct person *A, struct person *B ))
{
        struct person *last, *right = left + allnumber - 1, *i;
        if (left >= right)
          return 1;
        if (!swap(left, &left[(right-left)/2]))
          return 0;
        last = left;
        for (i = left + 1; i <= right; ++i)
        {      
          if (compare(i, left) < 0)
                if (!swap(++last, i))
                  return 0;
        }
        if (!swap(left, last))
          return 0;
        qsort(left, last-left, compare);
        qsort(last+1, right-last, compare);
        return 1;
}
//////////////////////// Обмен указателей на эл.массива структур //////////
int swap(struct person *A, struct person *B )
{
  struct person *temp;
  if ((temp = (struct person *)malloc(sizeof(struct person)))==NULL)
        return 0;
  *temp = *A;
  *A = *B;
  *B = *temp;
  return 1;
}

void compare(struct person *A, struct person *B ) //alphabet
{
        return strcmp(A->name, B->name);
}
/////////////////////// Заполнение массива структур //////////////////////
unsigned int fillStruct(FILE *file, struct person bigArray[], unsigned int arraySize)
{
    unsigned int index = 0;
    while((index < arraySize) && !feof(file))
        if (fscanf(file, " %9s %9s %19s \n", bigArray[index].name, bigArray[index].surname, bigArray[index].number) == 3)
            ++index;
    printf("%u", index);
    return index;
}

Вот кусок, ответственный за вывод(проверку) заполненной структуры
Используется синтаксис C++
if(!strcmp(answer, "Yes"))
{
    count = fillStruct(MyBook, Contacts[SIZE], SIZE ); //заполняем структуру из файла
    printf("%u", count);
    for (i = 0; i < count; ++i)
       printf("%s %s %s \n", Contacts[i].name, Contacts[i].surname, Contacts[i].number);
}
 

А это - функция заполнения из файла.
Используется синтаксис C++
unsigned int fillStruct(FILE *file, struct person bigArray[], unsigned int arraySize)
{
    unsigned int index = 0;
    while((index < arraySize) && !feof(file))
        if (fscanf(file, " %9s %9s %19s \n", bigArray[index].name, bigArray[index].surname, bigArray[index].number) == 3)
            ++index;
    printf("%u", index);
    return index;
}
 

 Профиль  
                  
 
 Re: Продолжение темы с записной книжкой. Си.
Сообщение25.11.2013, 22:58 


20/10/12
235
Нет, я серьезно ничего не понимаю, мне просто не модифицировать код, если я НЕ понимаю почему он не работает. А ведь мне нужно сделать сортировку. Скажите уже,пожалуйста, где я навалял в этот раз?
код: [ скачать ] [ спрятать ]
Используется синтаксис C++
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#define SIZE 200
#define BUFF 10000
#define MODBUFFER 10
/*Количество имен 200 x (10 + 10 + 20 ) = 8000*/
/*Записная книга*/
int modecorrect(char *str); /*Прототипы*/ /*Проверка упр. строки*/
int getdata(unsigned char *field, FILE *file); /*Получение данных формы*/
unsigned int fillStruct(FILE *file, struct person bigArray[], unsigned int arraySize);
/*заполнение структуры из файла*/
struct person{                            /*Структура записи*/
  unsigned char name[10];
  unsigned char surname[10];
  unsigned char number[20];
};
int main(void)
{
FILE *MyBook;
unsigned int i, count; //for initializing structure
struct person NewData;
struct person Contacts[SIZE]; /*Массив структур*/
unsigned char *out = malloc(BUFF * sizeof(unsigned char));
/*указатель в файле при выводе и сортировке*/
unsigned char *pname    = NewData.name;     /*используются в первичном заполнении*/      
unsigned char *psurname = NewData.surname;
unsigned char *pnumber  = NewData.number;

unsigned char *mode     = malloc(MODBUFFER * sizeof(unsigned char)); /* Read or Add */
unsigned char *answer   = malloc( 4 * sizeof(unsigned char));        /* YES / NO */
printf("MyBook 1.0\nEnglish language is used(!) \nChoose your mode:");
while(1){ //// !!!!!Начало общего зацикливания
printf("\nInput \"Read\" or \"Add\"\n");
gets(mode);
printf("\n");
if(!strcmp(mode,"Add")) /*Режим добавления*/
{
if((MyBook = fopen("MyBook.txt", "a+")) == NULL)//
printf("Writing MyBook.txt error");

printf("Please, input new data\nto stop press <Enter>\n");
while(1){//////////////////
printf("Name: ");
 getdata(pname, MyBook);
if(!strcmp(pname, ""))
 break;
fprintf(MyBook, " ");

printf("Surname: ");
 getdata(psurname, MyBook);
fprintf(MyBook, " ");

printf("Number: ");
 getdata(pnumber, MyBook);
fprintf(MyBook, "\n");
}//////////////////////////
fclose(MyBook);
}
/* Режим чтения и сортировки */
if(!strcmp(mode,"Read"))
{
if((MyBook = fopen("MyBook.txt", "r")) == NULL)
printf("Reading MyBook.txt error");
do{
 fscanf(MyBook, "%c" , out);
 putchar(*out);
}while(!feof(MyBook));
do{
 printf("\n Alphabet sort? Input \"Yes\" or \"No\" ");
 gets(answer);
}while(strcmp(answer, "Yes") && strcmp(answer, "No"));

if(!strcmp(answer, "Yes"))
{
    count = fillStruct(MyBook, Contacts, (unsigned int)SIZE ); //заполняем структуру из файла

    for (i = 0; i < count; ++i)
       printf(" %9s %9s %19s \n", Contacts[i].name, Contacts[i].surname, Contacts[i].number);
}

fclose(MyBook);
}
/// QSORT ///
} ////!!!!
return 0;
}

int modecorrect(char *str)  /* small functions */
{
if(!strcmp(str, "Add") || !strcmp(str, "Read"))
 return 1;
return 0;
}

int getdata(unsigned char *field, FILE *file)
{
gets(field);
fputs(field, file);
return 0;
}

////////////////////// Сортировка по алфавиту  //////////////////////////
int qsort(struct person *left, int allnumber, int (*compare)(struct person *A, struct person *B ))
{
        struct person *last, *right = left + allnumber - 1, *i;
        if (left >= right)
          return 1;
        if (!swap(left, &left[(right-left)/2]))
          return 0;
        last = left;
        for (i = left + 1; i <= right; ++i)
        {      
          if (compare(i, left) < 0)
                if (!swap(++last, i))
                  return 0;
        }
        if (!swap(left, last))
          return 0;
        qsort(left, last-left, compare);
        qsort(last+1, right-last, compare);
        return 1;
}
int swap(struct person *A, struct person *B )
{
  struct person *temp;
  if ((temp = (struct person *)malloc(sizeof(struct person)))==NULL)
        return 0;
  *temp = *A;
  *A = *B;
  *B = *temp;
  return 1;
}
///////////////////////////Сравнение//////////////////////////////
int compare(struct person *A, struct person *B )
{
        return strcmp(A->name, B->name);
}
/////////////////////// Заполнение массива структур //////////////////////

unsigned int fillStruct(FILE *file, struct person bigArray[], unsigned int arraySize)
{
   unsigned int index = 0;
   while((index < arraySize) && !feof(file)){
    if (fscanf_s(file," %9s %9s %19s \n", bigArray[index].name, bigArray[index].surname, bigArray[index].number) == 3)
                ++index;} /*Чтение строки из файла и заодно подсчет*/
   return index;
}
 

В злополучном файле стройные ряды записей - все по формату и заполнялось из программы.
Код:
..................
Millie Row 89056066612
Abigail Starkey 89001616111
Abraham Louis 89005663423
Antony Griffits 88055664545
Daniel James 87056777712
Howard Richards 89212112131
Arnold Karol 89914551471
Samantha Soares 80903452313
Karl Garsia 89034565608
Ashley May 98018009009
Peter Dorthmud 98074561230
..................

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 22 ]  На страницу Пред.  1, 2

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



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

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


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

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