singlepost

[ЗАКРЫТО] Ошибка при выводе на экран. << На главную или назад  

███████████████████████████████████████

ОПИСАНИЕ ПРОБЛЕМЫ В СООБЩЕНИИ #11

███████████████████████████████████████

Всем доброй ночи. //решено

======================================

Есть файл, в нем записи вида:

3318 скор Москва 06:30 08
3342 скор Бирибиджан 07:40 96
1101 элкт Сиверский08:20 02
1215 элкт Луга 05:31 03
2467 сидч Киев 12:55 12
1182 элкт Гатчина14:25 01
3391 скор Новосибирск06:50 30
4300 элтн Москва 10:00 04
2323 сидч Мурманск 01:55 12
4497 элтн Берлин 16:12 29

Мне нужно:

1) Прочитать.

2) Засунуть это в структуру:

struct tutu{
char num[5];
char type[5];
char city[16];
char depart[6];
char time[2];
};

3) Вывести на экран:

???

4) вывести нужно по запросу (тип поезда ИЛИ пункт назначения)

======================================

Проблемы в пункте (1) и (2).

Не совсем понимаю, как это прочитать. Не было такого опыта, я новичок в С++.

Насколько я понимаю, выглядеть это должно так:


FILE *rasp;

rasp=fopen(BaseName, "r");

Все, теперь все это чудо из файла хранится в переменной rasp. Читается у меня не одной строчкой, а с проверкой на NULL, так что файл оно цепляет, я гарантирую это.

НО. Теперь мне содержимое переменной rasp нужно запихнуть в структуру. Допустим, в файле 10 строчек с поездами. Значит, каждый кусочек строки мне нужно запихнуть в некую переменную структуры?

Моя фантазия выдает такое:

fscanf(rasp,"%s %s %s %s %s",tutu.num,tutu.type,tutu.city,tutu.depart,tutu.time);

Ну а тут уже вылетает ошибка.

Собственно вот.

Нужно как то засунуть содержимое файла в структуры (все 10 строчек).

С выводом, думаю, проблем не будет.

Заранее спасибо.

12 ответов в теме “[ЗАКРЫТО] Ошибка при выводе на экран.”

  1. 11
    Денис Доманский ответил:

    Вопрос снят.

  2. 10
    Денис Доманский ответил:

    Так, назрел еще один вопрос. При попытке вывода БД, вылетаю с ошибкой:

    Unhandled exception at 0×102a3aa0 in Z8-TrainBaseClass.exe: 0xC0000005: Access violation writing location 0xcccccccc.

    Тут всё не помещается, так что, помогите пожалуйста:

    //vkontakte.ru/note1381406_8921088

    Заранее спасибо.

  3. 9
    Денис Доманский ответил:

    Всем большое спасибо )

  4. 8
    Леонид Максимов ответил:

    прошу прощения. вы правы.

  5. 7
    Yan Mihailov ответил:

    #include <stdio.h>

    int main()
    {

    int account;
    char name[30];
    double balance;

    FILE *cfPtr;

    if((cfPtr=fopen("clients.dat", "r"))==NULL) printf("File could not be opened\n");
    else{
    printf("%-10s%-13s%s\n", "Account", "Name", "Balance");
    fscanf(cfPtr, "%d%s%f", &account, name, &balance);

    while(!feof(cfPtr)){
    printf("%-10d%-13s%7.2f\n", account, name, balance);
    fscanf(cfPtr, "%d%s%f", &account, name, &balance);}

    fclose(cfPtr);
    }
    return 0;

    }

  6. 6
    Yan Mihailov ответил:

    вот небольшой пример, как надо считывать файлы

  7. 5
    Денис Лисов ответил:

    Нет. Имя массива – это константный указатель на его нулевой элемент, что нам и нужно.

  8. 4
    Леонид Максимов ответил:

    предолженный вариант сохраняет исходную ошибку – fscanf хочет указатели. а потому таким кодом вы навлечете SIGSEGV (Segmentation Fault, General Protection Error, etc) на свою голову.

  9. 3
    Денис Лисов ответил:

    Первая ошибка. Если time – это последняя пара цифр, то выделять под них надо три байта, а вы выделяете только два.

    Вторая ошибка. Надо выделить массив для хранения этих данных и читать туда.
    struct tutu sp[10];
    int i;
    for(i=0;i<10;i++)
    fscanf(rasp,"%s%s%s%s%s",
    sp.num,sp.type,sp.city,sp.depart,sp.time);
    Это если число строк известно заранее, иначе сложнее.

  10. 2
    Yan Mihailov ответил:

    Форматный ввод-вывод файлов можно построить на функциях fscant
    и fprintf . Они идентичны scant и printf с той лишь разницей, что первым
    их аргументом является указатель на файл, для которого осуществляется
    ввод-вывод, формат же указывается вторым аргументом.
    int fscanf(FILE *fp, char *format, …)
    int fprintf(FILE *fp, char «format, …)

    из книги Кернигана и Ричи, "Язык программирования Си"

  11. 1
    Леонид Максимов ответил:

    читайте справку по fscanf – оно хочет указатели.

    ЗЫ: и не забудьте подумать о том, как fscanf будет определять, сколько байт ей следует прочитать в ту или иную переменную.

    ЗЗЫ: в C++ обычно используются потоки (ifstream, ofstream, etc)

Клуб программистов работает уже ой-ой-ой сколько, а если поточнее, то с 2007 года.