Суббота, 20 Апреля 2024, 16:47

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Форум игроделов » Программирование » C/C++ » Считывание строк из файла
Считывание строк из файла
IzBePgДата: Пятница, 13 Июня 2014, 22:00 | Сообщение # 1
Сейчас нет на сайте
Привет всем.
Вот теперь мучаюсь тут.
Как считать строки с файла?
Допустим если пользователь ввёл 1(то есть это индекс группы), то считываются первые 10 строк и далее обрабатываются
Если ввёл 2, то берём с 10 строки по 20, если 3, то с 20 по 30.
не могу понять как и что именно использовать, fgets или getline ли или что ещё wacko
Storm54Дата: Пятница, 13 Июня 2014, 22:13 | Сообщение # 2
постоянный участник
Сейчас нет на сайте
Если строки фиксированного размера, то можно попробовать сначала вызвать fseek, чтобы передвинуть курсор на нужную строку, а потом просто прочитать 10 строк.
Если длина строки неизвестна, то можешь просто вызывать getline, пока не дойдешь до первой, нужной тебе, строки, а с нее уже начинать работу.
IzBePgДата: Пятница, 13 Июня 2014, 22:15 | Сообщение # 3
Сейчас нет на сайте
Можно подробнее про getline?
Желательно пример, так намного лучше усваивается(я работаю на C++ Builder 6 если что)
Storm54Дата: Пятница, 13 Июня 2014, 22:22 | Сообщение # 4
постоянный участник
Сейчас нет на сайте
Через пару минут скину полный пример.

Добавлено (13.06.2014, 22:22)
---------------------------------------------
Код
#include <iostream>
#include <fstream>

using namespace std;

int main(int argc, char *argv[])
{
       string str;
       int count=0;
       ifstream f("file.txt");    
          
       cout << "input first string number:";
       int number;
       cin >> number;
          
       while(!f.eof())
       {      
           getline(f, str);
           ++count;
           if (count==number)
           {
         
      for(int i=0;i<10;i++)
      {
       cout << str << endl;
       getline(f, str);
      }
         
      break;
     }
                    
        }      

       
        f.close();
        cout << endl;
        system("PAUSE");
        return 0;
}


Вот. Доходим до номера строки, введенного вначале программы и выводим 10 строк, включая и ту, которую указали.
Если есть вопросы по коду- задавай.


Сообщение отредактировал Storm54 - Пятница, 13 Июня 2014, 22:24
IzBePgДата: Пятница, 13 Июня 2014, 22:34 | Сообщение # 5
Сейчас нет на сайте
Если честно признаться, я ничего не понял)
Сейчас всё разжую, возможно я неправильно выразился(или всё же не понял wacko )
Моя цель:
Создать файл, содержащий сведения о сдаче студентами первого курса сессии. Структура записи – Индекс группы, фамилия студента, оценки по пяти экзаменам, признак участия в общественной работе.Количество записей -30, из них три группы по 10 человек.
Как я сделал ввод данных:
Код
//---------------------------------------------------------------------------

#include <vcl.h>
#include <stdio.h>
#include <conio.h>
#pragma hdrstop

//---------------------------------------------------------------------------

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

Только такая мысль была сделать группы и вот исходя из того что сделал, единственный вариант считывание из файла построчно.
Если твой код верный для этой задачи, то извиняюсь, буду думать, что и как
Storm54Дата: Пятница, 13 Июня 2014, 23:19 | Сообщение # 6
постоянный участник
Сейчас нет на сайте
Понятно. Тогда, конечно, проще писать в файл бинарно, а потом так же читать оттуда.
Сейчас накидаю пример.

Добавлено (13.06.2014, 23:19)
---------------------------------------------
Код
#include <iostream>

using namespace std;

struct students
{
char fam[15];
int his;
int math;
int phys;
int prog;
int bio;
int happy;
};       

void SaveToFile(students* lp, int count, const char* filename)
{
       FILE*f;
       f=fopen(filename,"wb");       
             
       fwrite(&count, sizeof(int), 1, f);
       for(int i=0;i<count;i++)
       {
        fwrite(&lp[i].fam, sizeof(char), 15, f);
        fwrite(&lp[i].his, sizeof(int), 1, f);       
        fwrite(&lp[i].math, sizeof(int), 1, f);       
        fwrite(&lp[i].phys, sizeof(int), 1, f);       
        fwrite(&lp[i].prog, sizeof(int), 1, f);       
        fwrite(&lp[i].bio, sizeof(int), 1, f);       
        fwrite(&lp[i].happy, sizeof(int), 1, f);       
       }
       fclose(f);
}

void LoadFromFile(students*& lp, int& count, const char* filename)
{
       FILE*f;
       f=fopen(filename,"rb");       
             
       fread(&count, sizeof(int), 1, f);
             
       lp = new students[count];
             
       for(int i=0;i<count;i++)
       {
        fread(&lp[i].fam, sizeof(char), 15, f);
        fread(&lp[i].his, sizeof(int), 1, f);       
        fread(&lp[i].math, sizeof(int), 1, f);       
        fread(&lp[i].phys, sizeof(int), 1, f);       
        fread(&lp[i].prog, sizeof(int), 1, f);       
        fread(&lp[i].bio, sizeof(int), 1, f);       
        fread(&lp[i].happy, sizeof(int), 1, f);       
       }
             
       fclose(f);
}

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
IzBePgДата: Пятница, 13 Июня 2014, 23:25 | Сообщение # 7
Сейчас нет на сайте
ОоооОоОо Это просто вынесет мне мозг wacko biggrin (в хорошем смысле)
Большое спасибо за код!(Буду разбирать с завтрашнего дня, ибо сегодня уже мозг не работает, 4 утра уже у меня biggrin )
Если что буду спрашивать в лс. Всего доброго cool
p.s (плюс поставил бы ещё, да не могу smile )
vasua99Дата: Суббота, 14 Июня 2014, 14:22 | Сообщение # 8
GNU follower
Сейчас нет на сайте
А можно еще круче сделать) Помимо своих структур с данными о студентах писать в начало файла структуру с нодами("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) };


пишем в файл, потом читаем:

Код

ifstream ifile("input");

// 1
ifile.seekg(nodesTable.tableSize, ios_base::beg);

// 2
ifile.seekg(nodesTable.tableSize + nodesTable.nodesSizes[0], ios_base::beg);
...



Жизнь игра, и мы в ней пешки... А я кушаю пельмешки)

Сообщение отредактировал vasua99 - Суббота, 14 Июня 2014, 14:26
OpenGOOДата: Суббота, 14 Июня 2014, 15:04 | Сообщение # 9
почти ветеран
Сейчас нет на сайте
Не круто, но проще для хранения данных использовать xml. Парсить xml это плёвое дело (если уже научился).

Мои проекты:
- Свободный и открытый клон World Of Goo
- TrueEngine2D (2D игровой фреймворк основанный на FreeBASIC)

[GameMaker: Studio v1.4.9999]
vasua99Дата: Суббота, 14 Июня 2014, 17:28 | Сообщение # 10
GNU follower
Сейчас нет на сайте
Как я понял ему нужно курсовую сделать. или что-то типо того. Так что не вариант. Да и для парсинга XML можно использовать готовую библиотеку. А еще можно JSON использовать)

Жизнь игра, и мы в ней пешки... А я кушаю пельмешки)
IzBePgДата: Суббота, 14 Июня 2014, 20:40 | Сообщение # 11
Сейчас нет на сайте
vasua99, да ты прав курсовая biggrin , но если я буду использовать что либо подобное неизвестное мне, что я не смогу объяснить, так сразу будет понятно, что
это не я делал smile
vasua99Дата: Суббота, 14 Июня 2014, 21:14 | Сообщение # 12
GNU follower
Сейчас нет на сайте
Ну структуры знаешь? если да - то как минимум тут ты все обьяснишь. Ну как вариант загружать весь файл в память, а потом нужное брать. Ну если записей много - сам понимаешь....

P.S Заметил, ты создал тему еще одну по похожему вопросу. В общем советую не плодить темы. Лучше спроси тут. Удачи smile


Жизнь игра, и мы в ней пешки... А я кушаю пельмешки)
Storm54Дата: Суббота, 14 Июня 2014, 23:15 | Сообщение # 13
постоянный участник
Сейчас нет на сайте
Если ООП не проходили, то делай через getline, иначе бери любой вариант, описанный ниже.
-l33t-h4xx-Дата: Воскресенье, 15 Июня 2014, 12:28 | Сообщение # 14
участник
Сейчас нет на сайте
Во-первых: ребята, вы намудрили!
Во-вторых, несколько вопросов автору.
1. Какой язык? С или С++? Тебе предлагают решения на С++, хотя сам ты пишешь на С. Я бы с осторожностью отнёсся к решениям на другом языке, преподаватель может не вполне оценить самодеятельность.
2. В чём вообще заключается задача? Что значит "создать файл, содержащий сведения"? Какими средствами должен создаваться файл и в каком формате должны быть записи? Сформулируй условия почётче.
3. Если ты пишешь в файл массив структур, можно ли на самом деле этот файл построчно считывать? Как ты себе это представляешь?


Как правильно задавать вопросы
IzBePgДата: Воскресенье, 15 Июня 2014, 16:37 | Сообщение # 15
Сейчас нет на сайте
-l33t-h4xx-, не всё так просто.Я первый курс, я не могу знать всего.
С++, сам я работаю на C++ Builder 6.
Нужно получается создать файл,забить туда сведения о студентах. Это получается ввод данных.
Далее нужно обработать эти данные по условию и вывести всё.
Вот моё задание если интересно

И вот это всё добро нужно осуществить
Форум игроделов » Программирование » C/C++ » Считывание строк из файла
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг