███████████████████████████████████████
ОПИСАНИЕ ПРОБЛЕМЫ В СООБЩЕНИИ #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 строчек).
С выводом, думаю, проблем не будет.
Заранее спасибо.
28 мая 2009 в 1:00
Вопрос снят.
27 мая 2009 в 21:01
Так, назрел еще один вопрос. При попытке вывода БД, вылетаю с ошибкой:
Unhandled exception at 0×102a3aa0 in Z8-TrainBaseClass.exe: 0xC0000005: Access violation writing location 0xcccccccc.
Тут всё не помещается, так что, помогите пожалуйста:
//vkontakte.ru/note1381406_8921088
Заранее спасибо.
27 мая 2009 в 12:02
Всем большое спасибо )
22 мая 2009 в 20:03
прошу прощения. вы правы.
22 мая 2009 в 15:05
#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;
}
22 мая 2009 в 15:05
вот небольшой пример, как надо считывать файлы
22 мая 2009 в 15:04
Нет. Имя массива – это константный указатель на его нулевой элемент, что нам и нужно.
21 мая 2009 в 22:02
предолженный вариант сохраняет исходную ошибку – fscanf хочет указатели. а потому таким кодом вы навлечете SIGSEGV (Segmentation Fault, General Protection Error, etc) на свою голову.
21 мая 2009 в 16:00
Первая ошибка. Если 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);
Это если число строк известно заранее, иначе сложнее.
21 мая 2009 в 12:02
Форматный ввод-вывод файлов можно построить на функциях fscant
и fprintf . Они идентичны scant и printf с той лишь разницей, что первым
их аргументом является указатель на файл, для которого осуществляется
ввод-вывод, формат же указывается вторым аргументом.
int fscanf(FILE *fp, char *format, …)
int fprintf(FILE *fp, char «format, …)
из книги Кернигана и Ричи, "Язык программирования Си"
21 мая 2009 в 10:03
читайте справку по fscanf – оно хочет указатели.
ЗЫ: и не забудьте подумать о том, как fscanf будет определять, сколько байт ей следует прочитать в ту или иную переменную.
ЗЗЫ: в C++ обычно используются потоки (ifstream, ofstream, etc)