Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Правильное чтение строки


Автор: Firex 24.10.2010, 18:09
Вывожу структурировыный массив в файл:
Код

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 считывает с пробелами... Можно ли как-то это обойти(например, с помощью другой функции?)? Мне необходимо записать в файл структуру, потом прочитать её и сравнить с другой структурой.

Автор: Crafty 24.10.2010, 18:24
Может должно быть так 
Код

fscanf(dbase,"%50s %d %d %d\n",goodsBuff[j].name,&goodsBuff[j].price,&goodsBuff[j].year, &goodsBuff[j].ct);
 %c считывает один символ.

Автор: Firex 24.10.2010, 18:28
Так тоже не получается...

Автор: Crafty 24.10.2010, 19:07
Firex, покажи свою структуру.

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

#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;
}

Автор: Firex 24.10.2010, 20:24
Возможно я ошибаюсь... Возможно и правильно считывает... но когда я начинаю сравнивать структуры, то не находит ни одного совпадения(а они 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);
            };
    };
}

В функцию подаётся массив структур, по условию необходимо дописать эти структуры в существующий файл, а если есть совпадения, то обновить записи. Если я записываю в файл структуры, а потом этот же файл читаю и сверяю, то не находит совпадений( а должно находить.

Автор: Crafty 24.10.2010, 20:54
В 39 строке поменяй на
Код

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

Автор: 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)

Автор: Firex 25.10.2010, 17:06
Цитата(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)

Поменял... Результат не изменился.

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


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

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

Автор: Firex 26.10.2010, 16:26
Склеил все куски программы в один...вот что получилось:
Код

#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, 18:11
Ещё раз переписал функцию 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");
        }
    };
}


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

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

Автор: Firex 26.10.2010, 19:37
Спасибо всем за помощь! Проблема со считыванием решилась.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)