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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите написать программу со структурой, помогите исправить программу 
:(
    Опции темы
VerLinG
Дата 19.12.2007, 22:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Помогите пожалуйста! Никак не пойму в чем проблема!!! Значит дело вот в чем...Я создаю собственный файл базы данных с помощью вот такого кода:

код C++ 
struct exchange{
    int n_rooms;
    int floor;
    int S;
    char adress[20];
   }flat[100];
FILE *fp;
int i = 0;


char filename[25];
    printf("Input filename: ");
    scanf("%s",&filename);
    printf("\n");
    int j;
    printf("Enter amount of elements: ");
    scanf("%d",&j);
    printf("\n");


for(int l=0;l<100;l++){
    flat[l].n_rooms=NULL;
    flat[l].floor=NULL;
    flat[l].S=NULL;
    for(int g=0;g<20;g++)
    flat[l].adress[g]=NULL;
}

while ((fp = fopen(filename, "w")) == NULL){

    printf("Cannot open file %s\n", filename);
    printf("Input filename: ");
    scanf("%s",&filename);
        }

for ( int i=0;i<j;i++){
    printf("input n_rooms :\n");
    scanf("%s",&flat[i].n_rooms);
    
    printf("input floor :\n");
    scanf("%d",&flat[i].floor);
    
    printf("input s :\n");
    scanf("%d",&flat[i].S);
    
    printf("input adress :\n");
    scanf("%s",&flat[i].adress);
    printf("\n");
}
for(i=0;i<100;i++)
fwrite(&flat[i], sizeof(exchange), 1, fp);

fclose(fp);    
printf("Thanks");
 getch(); 
 



Файл создается нормально, только вот почему то неправильно читается из него!!! Для чтения использую вот такой код:


код C++ 
 struct exchange{
    int n_rooms;
    int floor;
    int S;
    char adress[80];
   }flat[100];
    
    FILE *fp;
    int i = 0;

    char filename[25]="C:\\1.txt";
        
    while ((fp = fopen(filename, "r")) == NULL){

        printf("Cannot open file %s\n", filename);
        printf("Input filename: ");
        gets(filename);
        }
    

    while(fread(&flat[i],sizeof(exchange),1,fp)==1){  
            printf("%d\n",flat[i].n_rooms);
            printf("%d\n",flat[i].floor);
            printf("%d\n",flat[i].S);
            printf("%s\n",flat[i].adress);
            printf("\n");
            i++;
            
    
    }
getch();
  fclose(fp); 
 



Подскажите пожалуйста в чем дело!Почему не заполняется структура правильно? 

PM MAIL   Вверх
baldina
Дата 19.12.2007, 23:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

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



у тебя в первой структуре char adress[20]; а во второй char adress[80]; - размер разный, читается не то что записано.

а вообще...
0. используй подсветку синтаксиса, читать невозможно

1. определения структур обычно помещают в .h файл и включают во всех .c или .cpp где используются. этим гарантируется, что определение структуры и проч. одинаково во всех единицах компиляции.

2. для констант (у тебя это 100 и 20) используется
Код

const int num=100;

или
Код

#define NUM 100

так ошибку вроде твоей сделать сложнее

3. этот цикл
Код

for(int g=0;g<20;g++)
    flat[l].adress[g]=NULL;

излишен. достаточно adress[0] = '\0'; 

4. программа не гарантирует, что будет введено символов не больше, чем может поместиться в строке

ну еще там по мелочи, не очень важно, сначало это исправь
PM MAIL   Вверх
VerLinG
Дата 19.12.2007, 23:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Код

код C++ 
struct exchange{
    int n_rooms;
    int floor;
    int S;
    char adress[20];
   }flat[100];
FILE *fp;
int i = 0;


char filename[25];
    printf("Input filename: ");
    scanf("%s",&filename);
    printf("\n");
    int j;
    printf("Enter amount of elements: ");
    scanf("%d",&j);
    printf("\n");


for(int l=0;l<100;l++){
    flat[l].n_rooms=NULL;
    flat[l].floor=NULL;
    flat[l].S=NULL;
    for(int g=0;g<20;g++)
    flat[l].adress[g]=NULL;
}

while ((fp = fopen(filename, "w")) == NULL){

    printf("Cannot open file %s\n", filename);
    printf("Input filename: ");
    scanf("%s",&filename);
        }

for ( int i=0;i<j;i++){
    printf("input n_rooms :\n");
    scanf("%s",&flat[i].n_rooms);
    
    printf("input floor :\n");
    scanf("%d",&flat[i].floor);
    
    printf("input s :\n");
    scanf("%d",&flat[i].S);
    
    printf("input adress :\n");
    scanf("%s",&flat[i].adress);
    printf("\n");
}
for(i=0;i<100;i++)
fwrite(&flat[i], sizeof(exchange), 1, fp);

fclose(fp);    
printf("Thanks");
 getch(); 



Добавлено через 20 секунд
Код

struct exchange{
    int n_rooms;
    int floor;
    int S;
    char adress[80];
   }flat[100];
    
    FILE *fp;
    int i = 0;

    char filename[25]="C:\\1.txt";
        
    while ((fp = fopen(filename, "r")) == NULL){

        printf("Cannot open file %s\n", filename);
        printf("Input filename: ");
        gets(filename);
        }
    

    while(fread(&flat[i],sizeof(exchange),1,fp)==1){  
            printf("%d\n",flat[i].n_rooms);
            printf("%d\n",flat[i].floor);
            printf("%d\n",flat[i].S);
            printf("%s\n",flat[i].adress);
            printf("\n");
            i++;
            
    
    }
getch();
  fclose(fp); 



Добавлено через 48 секунд
вот вариант с подсветкой синтаксиса.

Добавлено через 2 минуты и 10 секунд
ошибки исправил. считывается из файла только 1 элемент структуры, остальное считывается в виде чисел
PM MAIL   Вверх
baldina
Дата 20.12.2007, 00:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

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



имхо все нормально у тебя считывается. просто ты в файл записываешь 100 элементов независимо от количества введенных, вот тебе куча нулей и выводится. поменяй в цикле записи 100 на j и почувствуй разницу
PM MAIL   Вверх
VerLinG
Дата 20.12.2007, 00:17 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



эффект один и тот же. если не трудно напиши пожалуйста в аську

Это сообщение отредактировал(а) VerLinG - 15.12.2008, 03:11
PM MAIL   Вверх
JackYF
Дата 20.12.2007, 00:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

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



Цитата(VerLinG @  20.12.2007,  00:17 Найти цитируемый пост)
если не трудно напиши пожалуйста в аську 448794829 

на форум обратился - на форуме и обсуждай. У людей свои дела есть.


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
baldina
Дата 20.12.2007, 01:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

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



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

Это сообщение отредактировал(а) baldina - 20.12.2007, 01:14
PM MAIL   Вверх
mcapple
Дата 23.12.2007, 20:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



В программе файл открывается файл с аргументом "r"/"w" для чтения/записи в текстовом режиме, при котором служебные символы заменяются. Возможно, следунт использовать "rb"/"wb" в качестве бинарного режима, в котором данные читаются и записываются без изменений.

while ((fp = fopen(filename, "rb")) == NULL){

        printf("Cannot open file %s\n", filename);
        printf("Input filename: ");
        gets(filename);
        }
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

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

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

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

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


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

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


 




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


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

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