1

Тема: Потрібна термінова допомога з виведенням даних з файлу!

Мені потрібно вивести декілька масивів символьного типу, а даний код виводить лише 1 масив, допоможіть модифікувати, бо гугл вже не допомагає)

FILE * ptrFile = fopen( "groups.dat" , "rb" );
 
  if (ptrFile == NULL)
  {
      fputs("Îøèáêà ôàéëà", stderr);
      exit(1);
  }
  fseek(ptrFile , 0 , SEEK_END);                         
  long lSize = ftell(ptrFile);                            
 
 while(!feof(ptrFile)){ 
 rewind (ptrFile);                                       
 
  char * buffer = (char*) malloc(sizeof(char) * lSize);
  if (buffer == NULL)
  {
      fputs("Îøèáêà ïàìÿòè", stderr);
      exit(2);
  }
  
  size_t result = fread(buffer, 1, lSize, ptrFile);       
  if (result != lSize)
  {
      fputs("Îøèáêà ÷òåíèÿ", stderr);
      exit (3);
  }
  
  puts(buffer);

  fclose (ptrFile);
  free (buffer);
  }
}

2

Re: Потрібна термінова допомога з виведенням даних з файлу!

Ну відкрийте ще кілька файлів і виведіть їх так само, в чому проблема?

3

Re: Потрібна термінова допомога з виведенням даних з файлу!

в мене дані повинні записуватися всі в 1 файл,  і виводитися аналогічно всі з одного файлу

4

Re: Потрібна термінова допомога з виведенням даних з файлу!

Я давав відповідь на питання, яке ви задали. Сформулюйте його нормальним чином і тоді можливо навіть чекати відповіді вам не доведеться.

Подякували: koala1

5

Re: Потрібна термінова допомога з виведенням даних з файлу!

Порада на майбутнє: дописка "терміново" без ключового слова "оплата" збільшує час отримання відповіді, в середньому, в 10 разів.

Re: Потрібна термінова допомога з виведенням даних з файлу!

Покажи увесь код, включаючі main

7 Востаннє редагувалося skyfer (21.05.2015 13:34:04)

Re: Потрібна термінова допомога з виведенням даних з файлу!

ось весь код, функція print_list_group

Post's attachments

main.c 5.92 kb, 398 downloads since 2015-05-21 

8

Re: Потрібна термінова допомога з виведенням даних з файлу!

Знову ж таки , на майбутнє, використовуйте оточення

КОД

Його ж не просто так сюди добавили. Це зручно.
А так, по програмі, то там де пароль, то у вас getch() по ідеї зчитує по одному символу. Звідси маємо, що всі паролі, які ви ввели будуть мати 1 цифру/букву. Потрібно це робити в циклі.
Ще одне зауваження , що ваші функції типу

int add_group(){........}

по ідеї повинні повертати значення цілого типу. В даному випадку, Ви нічого не повертаєте. Використовуйте тип void.

Прихований текст
int print_list_groups(){
    int choice;
{
  FILE * ptrFile = fopen( "groups.dat" , "rb" );

Тут наче теж помилка. Ще одна фігурна дужка тут не потрібна.

9

Re: Потрібна термінова допомога з виведенням даних з файлу!

це зрозумыв, з цим дякую, але як вивести всі дані з файлу все одно не пойму. по ідеї шоб їх вивести fread(ptrFile,sizeof(char),1,ptrFile);
puts(ptrFile);
от такий повинен бути запис, але не працює так, точніше нічого не виводить.

10 Востаннє редагувалося koala (23.05.2015 13:28:42)

Re: Потрібна термінова допомога з виведенням даних з файлу!

skyfer написав:

по ідеї шоб їх вивести

По ідеї ні.
fread читає просто блок байтів з файлу (вказаного останнім параметром) до пам'яті за певною адресою (перший параметр). Ваша команда призводить до перезапису структури FILE якимось байтом з файлу, що станеться далі - взагалі не зрозуміло.
puts виводить рядок, тобто послідовність байт, яка закінчується нульовим символом '\0'. Таку конструкцію читає з файлу функція fgets (тільки не до нульового символу, а до кінця рядка, але нам це і треба), а не fread.

11 Востаннє редагувалося skyfer (23.05.2015 11:13:19)

Re: Потрібна термінова допомога з виведенням даних з файлу!

тепер з циклу не випускає, якщо прибрати fseek то виводить правильно, але лише 1 групу, а із зміщенням зациклюється   

char list_group[6];
{
  FILE *ptrFile = fopen( "groups.dat" , "rb" );
 
  if (ptrFile == NULL)
  {
      fputs("Îøèáêà ôàéëà", stderr);
      exit(1);
  }
  while(!feof(ptrFile)){
  
    fgets(list_group, 6, ptrFile);  // ñ÷èòàòü ñèìâîëû èç ôàéëà
       puts(list_group);  // âûâîä íà ýêðàí
       fseek ( ptrFile , 6 , SEEK_END );
}
     fclose (ptrFile);
}

12

Re: Потрібна термінова допомога з виведенням даних з файлу!

я здається зрозумів з чим проблема, в мене виводить 1 рядок, а як зробити шоб зчитувало не до кінця рядка, а до кінця файлу? бо гугл ось не допомагає мені

koala написав:
skyfer написав:

по ідеї шоб їх вивести

По ідеї ні.
fread просто блок байтів з файлу (вказаного останнім параметром) до пам'яті за певною адресою (перший параметр). Ваша команда призводить до перезапису структури FILE якимось байтом з файлу, що станеться далі - взагалі не зрозуміло.
puts виводить рядок, тобто послідовність байт, яка закінчується нульовим символом '\0'. Таку конструкцію читає з файлу функція fgets (тільки не до нульового символу, а до кінця рядка, але нам це і треба), а не fread.

13 Востаннє редагувалося koala (23.05.2015 13:41:27)

Re: Потрібна термінова допомога з виведенням даних з файлу!

Не перемойтуйте файл (fseek), якщо вам це насправді не потрібно.
feof повертає 1, тільки якщо вже була спроба читати за межами файлу. А для того, щоб визначити, що ви вже дочитали до кінця, треба перевіряти кількість прочитаних байт. Я дуже не хочу лізти у ваш код (зокрема через відсутність відступів), але читати і писати файл треба одними і тими ж засобами. Якщо ви пишете через

fwrite(&group[i], sizeof(struct student),1,fPtrN);

то й читати треба через fread з аналогічними параметрами, а на кінець файлу перевіряти за кількістю прочитаних байт.

Так, і ще - коли у вас множинний вибір (функции menu і groups), то бажано використовувати switch - case, і виносити спільну частину коду (system("cls");) за його межі.
Так, а ще system("cls"); - то збочення (заради елементарної дії запускається програма, більша і складніша за вашу), якщо ви вже використовуєте conio.h (це інше збочення - бібліотека функції під операційну систему, що померла 20 років тому), то там є clrscr(). Хоча взагалі очищення консолі - то збочення, консоль потрібна саме для організації потокового виводу, а не менюшок з фіксованим положенням.

14

Re: Потрібна термінова допомога з виведенням даних з файлу!

я пробував через fread, однак мені треба зчитати оце

    
else{
        fwrite (&name_groups,sizeof(name_groups),1,fPtrG);
    }

пробував і чомусь не виходить, а в гуглі не знайшов зразків як считати весь файл

15

Re: Потрібна термінова допомога з виведенням даних з файлу!

fread (&name_groups,sizeof(name_groups),1,fPtrG);

не пробували?

Взагалі - спробуйте описати структуру файла словами: спершу іде ось таке (стільки байт), потім ось це (ще стільки-то байт) і т.д. Після цього перевірте, що саме так його і записуєте, а потім відповідно і читайте.

16

Re: Потрібна термінова допомога з виведенням даних з файлу!

пробував і так, але чомусь не працювало так, тепер працює, дякую велике!)

koala написав:
fread (&name_groups,sizeof(name_groups),1,fPtrG);

не пробували?

Взагалі - спробуйте описати структуру файла словами: спершу іде ось таке (стільки байт), потім ось це (ще стільки-то байт) і т.д. Після цього перевірте, що саме так його і записуєте, а потім відповідно і читайте.

17

Re: Потрібна термінова допомога з виведенням даних з файлу!

тільки назву останньої групи виводить чомусь 2 рази

Re: Потрібна термінова допомога з виведенням даних з файлу!

Я викачав цей код з архівом точно не пам'ятаю де, напевно в цій темі або не в цій і тримаю його в нотепаде. Розглядаю іноді котрй день.

Що це таке? Що це за рядок? Може це просто безглузда нісенітниця?

Тут принаймні коментарі не крокозябрами.

#include <stdio.h> 
#include <locale.h> 
#include <stdlib.h> 
#include <ctype.h>
#include <conio.h>
#include <string.h> 
struct student{
    int number;
    char name[15];
    char surname[15];
};

struct student group = { { 0 } };  //Тут описується змінна group типу цієї структури, і їй усі її поля забиваються нулями (іниціалізація).

struct marks{
    int number;
    int marks[5];
};


int main()
{   int i=0;
    char login1[]="skyfer",true_password[6]="1927s",login2[32],passw[6];
    setlocale(LC_ALL,"Rus"); 
    printf ("Введiть логiн: ");
    scanf ("%31s", login2);   //- ввод строки, ограниченной 31 символом.
    printf("Введiть пароль: ");
    passw[i]=getch();//Зверніть увагу getch () повертає один символ, прочитаний з клавіатури, 
//    не чекаючи введення <Enter>. При натисненні <Enter> (як на основній, так і на додаткової клавіатурі) видає 1 символ '\r' десятковий 13 (hex 0x0d). Клавіша "Забій" і стрілки теж не працюють, як завжди, Ви отримуєте їх коди.
    printf("*");
      while(passw[i]!=13)
    {
        i++;
        passw[i]=getch();
        printf("*");
    }
    passw[5]=0; //Круто 
    
    if (strcmp(login1,login2) != 0)
    {
       printf ("\nНе правильно введено логiн чи пароль\n");
       return 0;

    }
//    Функція повертає декілька значень, які вказують на відношення рядків :
//Нульове значення говорить про те, що обидва рядки рівні.
//Значення більше нуля вказує на те, що рядок string1 більше рядка string2, значення менше нуля свідчить про зворотне.

//Функція strcmp починає порівнювати по одному символу і як тільки будуть знайдені перші неоднакові символи, функція проаналізує числові коди цих символів. Чий код виявиться більше, той рядок і вважатиметься більшим.

    

    if (strcmp(true_password,passw) != 0)
    {
        printf ("\nНе правильно введено логiн чи пароль\n"); 
        return 0;
    }
    else
    {
        printf("\nВхiд в систему...\n");
        system("cls");
        menu();
    }
    return 0;
}



int menu(){
int choice;
printf("1.Групи\n");
printf("2.Оцiнки\n");
printf("4.Статистика\n");
printf("0.Вихiд з програми\n");
scanf ("%d", &choice);
    if(choice==1){
    groups();    
    }
     if (choice==2){
    marks();
    }
     if (choice==3){
    statistic();
    }
     if (choice==0){
    exit (1);
    }
}

/* Ввод двух чисел, вычисление суммы и печать результата  
#include <stdio.h> 
{ 
int a,b,c; 
scanf(" %d %d",&a,&b); 
c=a+b; 
printf("Cумма = %d \n",c) 
} 
*/


int groups(){
    int choice;
    system("cls");
    printf ("1.Додати нову групу\n");
    printf ("2.Редагувати групу\n");
    printf ("3.Видалити групу\n");
    printf ("4.Переглянути список груп\n");
    printf ("5.Повернутися в головне меню\n");
    printf ("0.Вихiд з програми\n");
    scanf ("%d", &choice);
    if (choice==1){    
    system("cls");
    add_group();
    }
    if (choice==2){    
    system("cls");
    edit_group();
    }
    if (choice==3){
    system("cls");
    delete_group();
    }
    if (choice==4){
    system("cls");
    print_list_groups();
    }
    if (choice==5){
    system("cls");
    menu();
    }
    if (choice==0){
    exit (1);
    }
}

//Она очищает экран консоли, для того и нужна. Например, cout<<"Я пишу в консоли! "//на консоли красуется эта дурацкай надпись system("cls");//надписи больше нет


int add_group()
{
    int numbers=0,i;
    char name_groups[6], dat[5]=".dat", name_group[10];
    struct student group={0,"",""};
    FILE *fPtrG;
    FILE *fPtrN;
    printf ("Введiть назву групи: ");
    scanf ("%s",name_groups);
    fflush(stdin);      //Если поток stream связан с файлом, открытым для записи, то при обращении к функции fflush() в этот файл будет физически записано содержимое выходного буфера. При этом файл остается открытым. 
        if ((fPtrG=fopen("groups.dat", "ab")) == NULL)//<идентификатор файла> = fopen(<имя файла>,<режим работы>);
        printf ("File could not be opened.\n");  // "ab" Дописывает в двоичный файл 
    else       // stdin сбрасывается буфер стандартного потока вывода
    {
    
        fwrite (&name_groups,sizeof(name_groups),1,fPtrG);  //fwrite(&d, sizeof(double), 1, fp);
    }
    
    fclose (fPtrG);
    strncpy(name_group,name_groups,6); //копиюем з name_groups до name_group
    strcat (name_group,dat); // конкатенация рядків- додаємо dat до name_group
    printf ("Введiть кiлькiсть студентiв в групi: ");    
    scanf("%d", &numbers); //- ввод строки не ограниченной 31 символом.
    
    if(numbers>0)
    {
      struct student group[numbers];// Що це таке? Що це взагалі таке? group[i].number це зрозуміло а це що таке? 

      if ((fPtrN=fopen(name_group, "ab")) == NULL) // "ab" Дописывает в двоичный файл 
         printf ("File could not be opened.\n");
    }     
    else
    {
        for (i=1;i<=numbers;i++)
        {
           group[i].number=i; 
           printf ("Прiзвище та Iмя студентaа №%d: \n", i);
           fscanf (stdin,"%s%s",group[i].name,group[i].surname); //читает  fscanf(fp, "%s%f", str, &f); 
           fseek( fPtrN ,sizeof(struct student) , SEEK_SET );  //Функция fseek перемещает указатель позиции в потоке. Устанавливает внутренний указатель положения в файле, в новую позицию, которая определяются путем добавления смещения к исходному положению.
           //изменить позицию на student байт относительно начала файла
           fwrite(&group[i], sizeof(struct student),1,fPtrN);
           //size_t fwrite(const void *буфер, size_t колич_байт, size_t счетчик, FILE *уф);
        }
    
    }

fclose (fPtrN);
}

groups();

//}


/*Функция fflush
#include <stdio.h>
int fflush(FILE *stream);

Если поток stream связан с файлом, открытым для записи, то при обращении к функции fflush() в этот файл будет физически записано содержимое выходного буфера. При этом файл остается открытым. 

Нулевое значение, возвращаемое функцией, свидетельствует о ее успешном выполнении, а значение EOF — о возникновении ошибки при записи. 

При нормальном завершении программы или при заполнении буферов все их coдержимое автоматически дозаписывается в файл. Кроме того, буфер дозаписывается в файл при закрытии файла. 

Пример
Приведенный фрагмент программы дозаписывает в файл содержимое буфера после каждой операции записи. 


  Предполагается, что fp связан с выходным файлом.


for(i=0; i<MAX; i++) {
  fwrite(buf, sizeof(some_type), 1, fp);
  fflush(fp);
} 

Зависимые функции
fclose() fopen() fread() fwrite() getc() putc() */



int edit_group(struct student *group)
{
    int choice=0;
    FILE *fPtrN;
    char name_group[10],dat[5]=".dat";
    print_list_groups();
    printf ("\nОберiть необхiдну групу: \n");
    scanf ("%s",name_group);
    strcat (name_group,dat);  // // конкатенация рядків- додаємо dat до name_group
        if((fPtrN=fopen(name_group, "rb+")) == NULL){
        printf ("File could not be opened.\n");
        }
        else{
        printf("%-2s%-15s%-15s", "Number", "Name", "Surname"); // Я ничого не зрозумів
        }    
        
        fclose (fPtrN);
    printf ("1.Змiнити iм'я студента\n");
    printf ("2.Змiнити прiзвище студента\n");
    printf ("3.Повернутися в меню групи\n");
    printf("0.Вихiд з програми\n");
    scanf ("%d", &choice);
    if (choice==3)
    {
      system("cls");
      groups();
    }
       if (choice==0){
      exit (1);
    }
    
}



int delete_group()
{
    int choice=0;
    char name_group[10],dat[5]=".dat";
    printf ("Введiть назву групи, яку бажаєте видалити: ");
    scanf ("%s",name_group);
    strcat (name_group,dat);
    if(remove(name_group)) {
    printf("Error delete group!");
    return 0;
    }
    else{
        printf("Successfully delete group!\n");
    }
    printf("\n1.Видалити ще одну групу\n2.Повернутися в меню групи\n");
    scanf ("%d", &choice);
    if (choice==1){
        system("cls");
        delete_group();
        }
    if (choice==2){
        system("cls");
        groups();
        }
}




int print_list_groups(){
         int choice;
    {
       FILE * ptrFile = fopen( "groups.dat" , "rb" );
      
       if (ptrFile == NULL)
       {
           fputs("Ошибка файла", stderr); // fputs запиати у файл stderr рядок "Ошибка файла"  тобто помилка
           exit(1);
       }
       fseek(ptrFile , 0 , SEEK_END);                         
       long lSize = ftell(ptrFile);                            
      
      while(!feof(ptrFile))
          { 
             char * buffer = (char*) malloc(sizeof(char) * lSize);
             if (buffer == NULL)
             {
               fputs("Ошибка памяти", stderr);
               exit(2);
             }
             size_t result = fread(buffer, 1, lSize, ptrFile);       
             if (result != lSize)
             {
               fputs("Ошибка чтения", stderr);
               exit (3);
             }
             puts(buffer);
             free (buffer);
          }
          
      fclose (ptrFile);
      
    }
     printf("\n1.Переглянути конкретну групу\n2.Повернутися до меню груп\n3.Повернутися до головного меню\n");
         scanf ("%d", &choice);
         if (choice==1)
         {
             specific_group();//функція за алгоритмом впринципі аналогічна до list_group, но так як і list_group не робоча)
         }
         if (choice==2)
         {
            system("cls");
            groups();
         }
         if (choice==3)
         {
            system("cls");
            menu();
        }

}


int specific_group(struct student *group){
int choice=0;
    printf("\n1.Повернутися до меню груп\n2.Повернутися до головного меню\n");
    scanf("%s", &choice);
    if (choice==1){
    system("cls");
    groups();
    }
    if (choice==2){
    system("cls");
    menu();
}
}


int marks()
{      
    int choice=0;    
    system("cls");
    printf ("1.Внести оцiнки\n");
    printf ("2.Редагувати оцiнки\n");    
    printf ("4.Повернутися в головне меню\n");
    printf("0.Вихiд з програми\n");
    scanf ("%d", &choice);
    if (choice==4)
    {    
      system("cls");
      menu();
    }
    if (choice==0)
    {
      exit (1);
    }
}

int statistic()
{
    int choice;
    system("cls");
    printf ("1.Абсолютний i якiсний показники\n");
    printf ("2.Рейтинг студентiв\n");
    printf ("3.Рейтинг груп\n");
    printf ("4.Повернутися в головне меню\n");
    printf("0.Вихiд з програми\n");
    scanf ("%d", &choice);
    if (choice==4)
    {
       system("cls");
       menu();
    }
    if (choice==0)
    {
       exit (1);
    }
}


165. struct student group[numbers];// Що це таке? Що це взагалі таке? groupi.number це зрозуміло а це що таке?



Ах ти!!  Тепер ось оно що •i було відкрито всередині себе, що не дозволено


Ах ти ж .. задерла!


•i було знайдено без співпадінь /i
Та на тобі!/i


А ось онож що.  Он що! Принаймні я зараз дужки приберу!