Привет всем. Вот теперь мучаюсь тут. Как считать строки с файла? Допустим если пользователь ввёл 1(то есть это индекс группы), то считываются первые 10 строк и далее обрабатываются Если ввёл 2, то берём с 10 строки по 20, если 3, то с 20 по 30. не могу понять как и что именно использовать, fgets или getline ли или что ещё
Если строки фиксированного размера, то можно попробовать сначала вызвать fseek, чтобы передвинуть курсор на нужную строку, а потом просто прочитать 10 строк. Если длина строки неизвестна, то можешь просто вызывать getline, пока не дойдешь до первой, нужной тебе, строки, а с нее уже начинать работу.
Если честно признаться, я ничего не понял) Сейчас всё разжую, возможно я неправильно выразился(или всё же не понял ) Моя цель: Создать файл, содержащий сведения о сдаче студентами первого курса сессии. Структура записи – Индекс группы, фамилия студента, оценки по пяти экзаменам, признак участия в общественной работе.Количество записей -30, из них три группы по 10 человек. Как я сделал ввод данных:
#pragma argsused int main(int argc, char* argv[]) {const index=3; int i,n,z; FILE*f; struct students { char fam[15]; int his; int math; int phys; int prog; int bio; int happy; }; students stud,A; f=fopen("Students.vbr","w"); printf("\n Set students in group= "); scanf("%d",&n); for (z=0;z<index;z++) { for (i=1;i<=n;i++) { printf("\n Set familia[%d]= ",z); scanf("%s",&stud.fam); printf("\n Set mark history[%d]= ",z); scanf("%d",&stud.his); printf("\n Set mark math[%d]= ",z); scanf("%d",&stud.math); printf("\n Set mark physics[%d]= ",z); scanf("%d",&stud.phys); printf("\n Set mark programm[%d]= ",z); scanf("%d",&stud.prog); printf("\n Set mark biology[%d]= ",z); scanf("%d",&stud.bio); printf("\n You happy man?[%d]= ",z); scanf("%d",&stud.happy); } } fwrite(&stud,sizeof(struct students),1,f); fclose(f); getch(); return 0; } //---------------------------------------------------------------------------
Только такая мысль была сделать группы и вот исходя из того что сделал, единственный вариант считывание из файла построчно. Если твой код верный для этой задачи, то извиняюсь, буду думать, что и как
int main(int argc, char *argv[]) { students arr[30];
//Здесь где-нибудь заполняем всех студентов //... //Сохраняем данные в файл
SaveToFile(arr,30,"file.dat");//передаем указатель на массив студентов, кол-во данных в массиве и имя файла. //Данные сохранены, теперь можно их загрузить в другой массив
students* lp; int count;
LoadFromFile(lp,count,"file.dat");//передаем любой указатель(функция присвоит ему адрес загруженного массива), переменную, в которую будет занесено кол-во элементов в массиве и имя файла.
//Данные загружены. Можем работать с ними. //...
//Не забудем убрать за собой. delete[] lp; }
Теперь можно без труда получить доступ к любому элементу массива и производить необходимые действия. Так же отвечу на возникшие вопросы.
Сообщение отредактировал Storm54 - Пятница, 13 Июня 2014, 23:31
ОоооОоОо Это просто вынесет мне мозг (в хорошем смысле) Большое спасибо за код!(Буду разбирать с завтрашнего дня, ибо сегодня уже мозг не работает, 4 утра уже у меня ) Если что буду спрашивать в лс. Всего доброго p.s (плюс поставил бы ещё, да не могу )
А можно еще круче сделать) Помимо своих структур с данными о студентах писать в начало файла структуру с нодами("nodes") групп. В эту структуру записывать размер(в байтах) каждой группы и смешение относительно начала файла. а потом с помощью "fseek" прыгать куда надо).
Для примера есть структура:
Код
struct NodesTable { int nodesCount; // count of groups int *nodesSizes; // sizes of groups int tableSize; // size of this table };
Создаем таблицу:
Код
const int groupsCount = 3; NodesTable nodesTable { groupsCount, new int[groupsCount], sizeof(int) * (groupsCount + 2) };
Не круто, но проще для хранения данных использовать xml. Парсить xml это плёвое дело (если уже научился). Мои проекты: - Свободный и открытый клон World Of Goo - TrueEngine2D (2D игровой фреймворк основанный на FreeBASIC)
Как я понял ему нужно курсовую сделать. или что-то типо того. Так что не вариант. Да и для парсинга XML можно использовать готовую библиотеку. А еще можно JSON использовать) Жизнь игра, и мы в ней пешки... А я кушаю пельмешки)
vasua99, да ты прав курсовая , но если я буду использовать что либо подобное неизвестное мне, что я не смогу объяснить, так сразу будет понятно, что это не я делал
Ну структуры знаешь? если да - то как минимум тут ты все обьяснишь. Ну как вариант загружать весь файл в память, а потом нужное брать. Ну если записей много - сам понимаешь....
P.S Заметил, ты создал тему еще одну по похожему вопросу. В общем советую не плодить темы. Лучше спроси тут. Удачи Жизнь игра, и мы в ней пешки... А я кушаю пельмешки)
Во-первых: ребята, вы намудрили! Во-вторых, несколько вопросов автору. 1. Какой язык? С или С++? Тебе предлагают решения на С++, хотя сам ты пишешь на С. Я бы с осторожностью отнёсся к решениям на другом языке, преподаватель может не вполне оценить самодеятельность. 2. В чём вообще заключается задача? Что значит "создать файл, содержащий сведения"? Какими средствами должен создаваться файл и в каком формате должны быть записи? Сформулируй условия почётче. 3. Если ты пишешь в файл массив структур, можно ли на самом деле этот файл построчно считывать? Как ты себе это представляешь? Как правильно задавать вопросы
-l33t-h4xx-, не всё так просто.Я первый курс, я не могу знать всего. С++, сам я работаю на C++ Builder 6. Нужно получается создать файл,забить туда сведения о студентах. Это получается ввод данных. Далее нужно обработать эти данные по условию и вывести всё. Вот моё задание если интересно
А. Создать файл, содержащий сведения о сдаче студентами первого курса сессии. Структура записи – Индекс группы, фамилия студента, оценки по пяти экзаменам, признак участия в общественной работе: «1»- активное участие, «0»- не участие. Количество записей -30, из них три группы по 10 человек. Б. Начислить студентам группы Х по ведомости стипендию. Студент, получивший все оценки «5» и активно участвующий в общественной работе, получает повышенную стипендию- доплата 50 %, не активно участвует – 25 %. Студенты , получившие «4» и «5» , зачисляются на обычную стипендию. Студент получивший одну оценку «3», но активно-занимающийся общественной работой, также зачисляется на стипендию, в противном случае начисление стипендии не производится. Индекс группы вводится с терминала.