Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Правильное чтение строки, язык С 
V
    Опции темы
Firex
Дата 24.10.2010, 18:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 58
Регистрация: 20.10.2010

Репутация: нет
Всего: нет



Вывожу структурировыный массив в файл:
Код

fprintf(dbase,"%-50s %-10d %d %d\n", vmass[j].name, vmass[j].price, vmass[j].year, vmass[j].ct);

А теперь считываю:
Код

fscanf(dbase,"%50c %d %d %d\n",goodsBuff[j].name,&goodsBuff[j].price,&goodsBuff[j].year, &goodsBuff[j].ct);

Ерунду считывает... ещё int переменные вроде нормально, а вот char считывает с пробелами... Можно ли как-то это обойти(например, с помощью другой функции?)? Мне необходимо записать в файл структуру, потом прочитать её и сравнить с другой структурой.
PM MAIL   Вверх
Crafty
Дата 24.10.2010, 18:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 319
Регистрация: 3.11.2008

Репутация: 12
Всего: 14



Может должно быть так 
Код

fscanf(dbase,"%50s %d %d %d\n",goodsBuff[j].name,&goodsBuff[j].price,&goodsBuff[j].year, &goodsBuff[j].ct);
 %c считывает один символ.
PM MAIL   Вверх
Firex
Дата 24.10.2010, 18:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 58
Регистрация: 20.10.2010

Репутация: нет
Всего: нет



Так тоже не получается...
PM MAIL   Вверх
Crafty
Дата 24.10.2010, 19:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 319
Регистрация: 3.11.2008

Репутация: 12
Всего: 14



Firex, покажи свою структуру.
PM MAIL   Вверх
Crafty
Дата 24.10.2010, 19:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 319
Регистрация: 3.11.2008

Репутация: 12
Всего: 14



Вот попробовал считать такую же структуру, у меня всё работает.
Код

#include <stdio.h>
#include <string.h>

int main ()
{
  struct Struc{
    char name[30];
    int price;
    int year;
    int ct;
  };

  struct Struc goodsBuff[2];

  strcpy(goodsBuff[0].name, "Hello");
  goodsBuff[0].price = 10;
  goodsBuff[0].year = 2010;
  goodsBuff[0].ct = 5;

  int i = 0;
  FILE *pFile;
  pFile = fopen ("myfile.txt","w+");
  fprintf(pFile,"%-50s %-10d %d %d\n", goodsBuff[i].name, goodsBuff[i].price, goodsBuff[i].year, goodsBuff[i].ct);
  rewind (pFile);
  fscanf (pFile, "%50s %d %d %d\n", goodsBuff[i].name, &goodsBuff[i].price, &goodsBuff[i].year, &goodsBuff[i].ct);
  fclose (pFile);
  printf ("I have read: %s and %d, %d, %d\n",goodsBuff[i].name, goodsBuff[i].price, goodsBuff[i].year, goodsBuff[i].ct);
  return 0;
}

PM MAIL   Вверх
Firex
Дата 24.10.2010, 20:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 58
Регистрация: 20.10.2010

Репутация: нет
Всего: нет



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

FILE *dbase;
void saving(struct goods *vmass, int z)
{
    struct goods goodsBuff[255];
    int j,k,p,h,m=0;

    setlocale (LC_CTYPE,"");
    dbase=fopen("d:\\dbase.db","rb");
    if (dbase==NULL) 
    {
        printf ("Ошибка открытия файла для чтения. Файл не существует. Создание файла для записи...\n");
        dbase=fopen("d:\\dbase.db","wb");
        if (dbase==NULL) printf ("Ошибка открытия файла для записи!\n");
        for (j=0;j<z;j++)
        {
        fprintf(dbase,"%-50s %-10d %d %d\n", vmass[j].name, vmass[j].price, vmass[j].year, vmass[j].ct);
        };
        fclose(dbase);
        printf("Файл создан, данные записаны.\n"); 
        
    }
    else
    {
        printf("\nЧтение данных из файла:\n");
        j=0;
        while (!feof(dbase))
        {
                h++;
                fscanf(dbase,"%50c %d %d %d\n",goodsBuff[j].name,&goodsBuff[j].price,&goodsBuff[j].year,&goodsBuff[j].ct);
                printf("%50s %-10d %d %d\n",goodsBuff[j].name,goodsBuff[j].price,goodsBuff[j].year,goodsBuff[j].ct);
            j++;
        };
        fclose(dbase);
        for (k=0;k<h;k++)
        {
                for (p=0;p<z;p++)
                {
                    //printf("p=%s ",goodsBuff[k].name);
                    if (&goodsBuff[k].name==&vmass[p].name)
                    {
                        printf("\n +++");
                        goodsBuff[k]=vmass[k];
                    };    
                };
        };
            dbase=fopen("d:\\dbase.db","wb");
            for (k=0;k<h;k++)
            {
                fprintf(dbase,"%-50s %-10d %d %d\n", goodsBuff[k].name,goodsBuff[k].price,goodsBuff[k].year,goodsBuff[k].ct);
                printf("+%d",k);
            };
    };
}

В функцию подаётся массив структур, по условию необходимо дописать эти структуры в существующий файл, а если есть совпадения, то обновить записи. Если я записываю в файл структуры, а потом этот же файл читаю и сверяю, то не находит совпадений( а должно находить.
PM MAIL   Вверх
Crafty
Дата 24.10.2010, 20:54 (ссылка)   | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 319
Регистрация: 3.11.2008

Репутация: 12
Всего: 14



В 39 строке поменяй на
Код

 if (strcmp(goodsBuff[k].name, vmass[p].name))

PM MAIL   Вверх
xvr
Дата 25.10.2010, 11:12 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Цитата(Crafty @ 24.10.2010,  20:54)
В 39 строке поменяй на
Код

 if (strcmp(goodsBuff[k].name, vmass[p].name))

точнее на
Код

 if (strcmp(goodsBuff[k].name, vmass[p].name)==0)

PM MAIL   Вверх
Firex
Дата 25.10.2010, 17:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 58
Регистрация: 20.10.2010

Репутация: нет
Всего: нет



Цитата(xvr @ 25.10.2010,  11:12)
Цитата(Crafty @ 24.10.2010,  20:54)
В 39 строке поменяй на
Код

 if (strcmp(goodsBuff[k].name, vmass[p].name))

точнее на
Код

 if (strcmp(goodsBuff[k].name, vmass[p].name)==0)

Поменял... Результат не изменился.
PM MAIL   Вверх
Dov
Дата 25.10.2010, 17:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

Репутация: 11
Всего: 88



а если так:
Код
 
if (strcmp(goodsBuff[k].name, vmass[p].name)==0)
{
    printf("\n +++");
    goodsBuff[k]=vmass[p];
}


Добавлено через 2 минуты и 42 секунды
Цитата(Firex @  24.10.2010,  19:24 Найти цитируемый пост)
 h++;

а где инициализация?



--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
Firex
Дата 26.10.2010, 16:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 58
Регистрация: 20.10.2010

Репутация: нет
Всего: нет



Склеил все куски программы в один...вот что получилось:
Код

#include <stdio.h>
#include <locale.h>
#include <string.h>
#include <stdlib.h>

struct goods 
{
    char name[256];
    int price;
    int year;
    int ct;
};

struct goods Mass[256];
int i = 0;
char flag;
FILE *dbase;
int compare (char *str1, char *str2);
void wGoods (char name[50], int price, int year, int ct);
void sorting (void);
void swap (struct goods *goods1, struct goods *goods2);
void saving (struct goods *vmass,int z);
void showing (void);

int main(int argc, char *argv[])
{
    setlocale (LC_CTYPE,"");
    wGoods ("Ранец школьный 'Jet pack'", 20, 2010, 1);
    wGoods ("Ручка шариковая 'James Bound'", 1, 2010, 5);
    wGoods ("Набор 'Очумелые ручки'", 5, 2009, 1);
    wGoods ("Мобильный телефон 'Nokia 2300'", 30, 2000, 3);
    wGoods ("Пенал 'Отечественный'", 3, 1995, 3);
    wGoods ("Палатка туристическая 'Рандеву'", 200, 2010, 1);
    wGoods ("Радиоприёмник 'Океан-214'", 10, 1985, 1);
    wGoods ("Стойка ЧПУ '2С-4265'", 300, 1990, 1);
    wGoods ("Стойка ЧПУ 'CNC-600'", 280, 1986, 2);
    wGoods ("Плитка тротуарная", 2, 2010, 1000);
    wGoods ("Сумка травника 'Бездонный карман'", 20, 2010, 30);
    
    showing();

    printf("\n");
    
    sorting();

    showing();

    saving(Mass,11);
    return 0;
}

void wGoods (char name[50], int price, int year, int ct)
{
    strcpy(Mass[i].name, name);
    Mass[i].price=price;
    Mass[i].year=year;
    Mass[i].ct=ct;
    i++;
}

void sorting()
{
    char sortingFlag = 't';
    int j;
    while (sortingFlag == 't')
    {
        sortingFlag = 'f';
        for (j = 0; j < i - 1; j++)
            if (Mass[j].year > Mass[j + 1].year)
            {
                swap (&Mass[j], &Mass[j + 1]);
                sortingFlag = 't';
            }
    }
}

void swap (struct goods *goods1, struct goods *goods2)
{
    struct goods goodsBuff;
    goodsBuff = *goods1;
    *goods1 = *goods2;
    *goods2 = goodsBuff;
}

void showing()
{
    int j;
    for (j = 0; j < i; j++)
        printf ("%-50s %-10d %d %d\n", Mass[j].name, Mass[j].price, Mass[j].year, Mass[j].ct);
}
void saving(struct goods *vmass, int z)
{
    struct goods goodsBuff[255];
    int j,k,p,h=0,m=0;

    setlocale (LC_CTYPE,"");
    dbase=fopen("d:\\dbase.db","rb");
    if (dbase==NULL) 
    {
        printf ("Ошибка открытия файла для чтения. Файл не существует. Создание файла для записи...\n");
        dbase=fopen("d:\\dbase.db","wb");
        if (dbase==NULL) printf ("Ошибка открытия файла для записи!\n");
        for (j=0;j<z;j++)
        {
        fprintf(dbase,"%-50s %-10d %d %d\n", vmass[j].name, vmass[j].price, vmass[j].year, vmass[j].ct);
        };
        fclose(dbase);
        printf("Файл создан, данные записаны.\n"); 
        
    }
    else
    {
        printf("\nЧтение данных из файла:\n");
        j=0;
        while (!feof(dbase))
        {
                h++;
                fscanf(dbase,"%50c %d %d %d\n",goodsBuff[j].name,&goodsBuff[j].price,&goodsBuff[j].year,&goodsBuff[j].ct);
                printf("%50s %-10d %d %d\n",goodsBuff[j].name,goodsBuff[j].price,goodsBuff[j].year,goodsBuff[j].ct);
                j++;
        };
        fclose(dbase);
        for (k=0;k<h;k++)
        {
            flag='f';
                for (p=0;p<z;p++)
                {
                    if (*goodsBuff[k].name==*vmass[p].name)
                            {
                        flag='t';
                        printf ("%s %s \n", goodsBuff[k].name, vmass[p].name); 
                               goodsBuff[k]=vmass[p];
                            };   
                };
            if(flag=='t')
            {
                goodsBuff[++h]=vmass[k];
            };
        };
            dbase=fopen("d:\\dbase.db","wb");
            for (k=0;k<h;k++)
            {
                fprintf(dbase,"%-50s %-10d %d %d\n", goodsBuff[k].name,goodsBuff[k].price,goodsBuff[k].year,goodsBuff[k].ct);
            };
            fclose(dbase);
    };
}

Поставил разадресацию.Теперь вроде бы всё правильно делает...  Но не совсем... вторая программа, которая использует эту же функцию, должна дописывать в файл некоторые структуры, которые не совпадают с уже записанными:
Код

#include <stdio.h>
#include <locale.h>
#include <string.h>
#include <stdlib.h>

struct goods 
{
    char name[256];
    int price;
    int year;
    int ct;
};
FILE *dbase;
int compare (char *str1, char *str2);
void saving (struct goods *vmass,int z);
void wGoods (char name[256], int price, int year, int ct);
struct goods Mass2[256];
int i=0;
char flag;
int main(int argc, char *argv[])
{
    setlocale (LC_CTYPE,"");
    wGoods ("Окно ПВХ", 25, 2010, 3);
    wGoods ("Мяч резиновый", 5, 2009, 2);
    wGoods ("Набор 'Очумелые ручки'", 4, 2009, 1);
    wGoods ("Мобильный телефон 'Nokia 2300'", 25, 2000, 2);
    wGoods ("Пенал 'Отечественный'", 3, 1995, 3);
    saving(Mass2,5);
    return 0;
}

void wGoods (char name[256], int price, int year, int ct)
{
    strcpy(Mass2[i].name, name);
    Mass2[i].price=price;
    Mass2[i].year=year;
    Mass2[i].ct=ct;
    i++;
}

void saving(struct goods *vmass, int z)
{
    struct goods goodsBuff[255];
    int j,k,p,h=0,m=0;

    setlocale (LC_CTYPE,"");
    dbase=fopen("d:\\dbase.db","rb");
    if (dbase==NULL) 
    {
        printf ("Ошибка открытия файла для чтения. Файл не существует. Создание файла для записи...\n");
        dbase=fopen("d:\\dbase.db","wb");
        if (dbase==NULL) printf ("Ошибка открытия файла для записи!\n");
        for (j=0;j<z;j++)
        {
        fprintf(dbase,"%-50s %-10d %d %d\n", vmass[j].name, vmass[j].price, vmass[j].year, vmass[j].ct);
        };
        fclose(dbase);
        printf("Файл создан, данные записаны.\n"); 
        
    }
    else
    {
        printf("\nЧтение данных из файла:\n");
        j=0;
        while (!feof(dbase))
        {
                h++;
                fscanf(dbase,"%50c %d %d %d\n",goodsBuff[j].name,&goodsBuff[j].price,&goodsBuff[j].year,&goodsBuff[j].ct);
                printf("%50s %-10d %d %d\n",goodsBuff[j].name,goodsBuff[j].price,goodsBuff[j].year,goodsBuff[j].ct);
                j++;
        };
        fclose(dbase);
        for (k=0;k<h;k++)
        {
            flag='f';
                for (p=0;p<z;p++)
                {
                    if (*goodsBuff[k].name==*vmass[p].name)
                            {
                        flag='t';
                        printf ("%s %s \n", goodsBuff[k].name, vmass[p].name); 
                               goodsBuff[k]=vmass[p];
                            };   
                };
            if(flag=='t')
            {
                goodsBuff[++h]=vmass[k];
            };
        };
            dbase=fopen("d:\\dbase.db","wb");
            for (k=0;k<h;k++)
            {
                fprintf(dbase,"%-50s %-10d %d %d\n", goodsBuff[k].name,goodsBuff[k].price,goodsBuff[k].year,goodsBuff[k].ct);
            };
    };
}


Немогу понять, где я тут накосячил, но результат напрочь не соответствует ожиданиям(

Это сообщение отредактировал(а) Firex - 26.10.2010, 16:30
PM MAIL   Вверх
Firex
Дата 26.10.2010, 18:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 58
Регистрация: 20.10.2010

Репутация: нет
Всего: нет



Ещё раз переписал функцию saving()... Считывает только первый элемент правильно... остальные не читаются... Помогите пожалуйста)
Код

#include <stdio.h>
#include <locale.h>
#include <string.h>
#include <stdlib.h>

struct goods 
{
    char name[256];
    int price;
    int year;
    int ct;
};

struct goods Mass[256];
int i = 0;
char flag;
FILE *dbase;
int compare (char *str1, char *str2);
void wGoods (char name[50], int price, int year, int ct);
void sorting (void);
void swap (struct goods *goods1, struct goods *goods2);
void saving (struct goods *vmass,int z);
void showing (void);

int main(int argc, char *argv[])
{
    setlocale (LC_CTYPE,"");
    wGoods ("Ранец школьный 'Jet pack'", 20, 2010, 1);
    wGoods ("Ручка шариковая 'James Bound'", 1, 2010, 5);
    wGoods ("Набор 'Очумелые ручки'", 5, 2009, 1);
    wGoods ("Мобильный телефон 'Nokia 2300'", 30, 2000, 3);
    wGoods ("Пенал 'Отечественный'", 3, 1995, 3);
    wGoods ("Палатка туристическая 'Рандеву'", 200, 2010, 1);
    wGoods ("Радиоприёмник 'Океан-214'", 10, 1985, 1);
    wGoods ("Стойка ЧПУ '2С-4265'", 300, 1990, 1);
    wGoods ("Стойка ЧПУ 'CNC-600'", 280, 1986, 2);
    wGoods ("Плитка тротуарная", 2, 2010, 1000);
    wGoods ("Сумка травника 'Бездонный карман'", 20, 2010, 30);
    
    showing();

    printf("\n");
    
    sorting();

    showing();

    saving(Mass,11);
    return 0;
}

void wGoods (char name[50], int price, int year, int ct)
{
    strcpy(Mass[i].name, name);
    Mass[i].price=price;
    Mass[i].year=year;
    Mass[i].ct=ct;
    i++;
}

void sorting()
{
    char sortingFlag = 't';
    int j;
    while (sortingFlag == 't')
    {
        sortingFlag = 'f';
        for (j = 0; j < i - 1; j++)
            if (Mass[j].year > Mass[j + 1].year)
            {
                swap (&Mass[j], &Mass[j + 1]);
                sortingFlag = 't';
            }
    }
}

void swap (struct goods *goods1, struct goods *goods2)
{
    struct goods goodsBuff;
    goodsBuff = *goods1;
    *goods1 = *goods2;
    *goods2 = goodsBuff;
}

void showing()
{
    int j;
    for (j = 0; j < i; j++)
        printf ("%-50s %-10d %d %d\n", Mass[j].name, Mass[j].price, Mass[j].year, Mass[j].ct);
}
void saving(struct goods *vmass, int z)
{
    struct goods goodsBuff[255];
    int goodsBuffCt=0,count,p,h,kill;
    char flag;
    dbase=fopen("d:\\dbase.db","rb");
    if (dbase==NULL) 
    {
        printf ("\nОшибка открытия файла для чтения. Файл не существует. Создание файла для записи...\n");
        dbase=fopen("d:\\dbase.db","wb");
        if (dbase==NULL) 
            {
                printf ("\nОшибка открытия файла для записи!\n");
                exit(-1);
            };
        if(fwrite(vmass,sizeof(struct goods),z,dbase)==z)
        {
        printf("Файл создан, данные записаны.\n");
        };
        fclose(dbase);
        
    }
    else
    {
        //fseek(dbase, 0L, SEEK_SET);
        while (!feof(dbase))
        {
            count=fread(goodsBuff,sizeof(goodsBuff[goodsBuffCt]),1,dbase);
            printf(">>>%s<<<\n",goodsBuff[goodsBuffCt].name);
            goodsBuffCt++;
            printf("count=%d",count);
        };
        fclose(dbase);
        printf("\ndbase if close\n");
        for (p=0;p<z;p++)
        {
            //printf("Считало - %s",goodsBuff[p].name);
            flag='f';
            for(h=0;h<goodsBuffCt;h++)
            {
                if(vmass[p].name==goodsBuff[h].name)
                {
                    goodsBuff[h]=vmass[p];
                    printf("совпадение №%d",kill);
                    kill++;
                    flag='t';
                };
            };
            if(flag=='f')
            {
                goodsBuff[++goodsBuffCt]=vmass[p];
            };
        };
        dbase=fopen("d:\\dbase.db","wb");
        if(fwrite(goodsBuff,sizeof(struct goods),goodsBuffCt,dbase)==goodsBuffCt)
        {
            printf("\nФайл с данными изменён!\n");
        }
    };
}


PM MAIL   Вверх
Crafty
Дата 26.10.2010, 19:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 319
Регистрация: 3.11.2008

Репутация: 12
Всего: 14



В 118 строке записывается только в первый элемент массива.
Нужно вот так:
Код

count=fread(&goodsBuff[goodsBuffCt],sizeof(struct goods),1,dbase);

PM MAIL   Вверх
Firex
Дата 26.10.2010, 19:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 58
Регистрация: 20.10.2010

Репутация: нет
Всего: нет



Спасибо всем за помощь! Проблема со считыванием решилась.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0879 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.