1 Востаннє редагувалося Віталій_Боднар (09.06.2018 15:46:33)

Тема: Проблема з функцією fseek()

Умова задачі:
Задати масив дійсних чисел розмірністю 9, записати його в файл на диску, прочитати з нього в змінні  2-ий, 5-ий і 8-й  елементи масиву. Значення цих елементів вивести на екран.

2

Re: Проблема з функцією fseek()

І що ж у вас не виходить?

3 Востаннє редагувалося Віталій_Боднар (09.06.2018 15:47:55)

Re: Проблема з функцією fseek()

У мене невиходить з функцією fssek взяти 2 елемент і считат його в змінну
[code=C++]
#include<stdio.h>
#include<stdlib.h>

int main() {
    FILE  *fp2;
    float b[9] = { 1.1, 1.1, 1.1, 1.1, 1.2, 1.1, 1.1, 3.2, 6.9 }, a1, a2, a3;

    fp2 = fopen("C:\\123\\pp4.txt", "w");
    if(fp2 != NULL)
        printf("\nSuccessful opening  r.\n");
    else {
        printf("pomilka\n");
        exit(0);
    }
    fputs(b, fp2);
    fclose(fp2);

    fp2 = fopen("C:\\123\\pp4.txt", "r");
    if(fp2 != NULL)
        printf("\nSuccessful opening  w.\n");
    else {
        printf("pomilka\n");
        exit(0);
    }
    fseek(fp2, sizeof(float), 0);
    if(fread(&a1, sizeof(float), 2, fp2) != 1)
        printf("pom");

    system("pause");
}[/code]

Оригінал
#include<stdio.h>
#include<stdlib.h>
int main(){
    FILE  *fp2; 
float b[9]={1.1,1.1,1.1,1.1,1.2,1.1,1.1,3.2,6.9},a1,a2,a3;;

    


fp2 = fopen("C:\\123\\pp4.txt","w" ); 
    if ( fp2!= NULL ){
    
 printf("\nSuccessful opening  r.\n");}
  else { printf("pomilka\n")  ;   exit(0);  }
fputs(b, fp2) ;    fclose(fp2);
   fp2 = fopen("C:\\123\\pp4.txt","r" );
    if ( fp2!= NULL ){
    
 printf("\nSuccessful opening  w.\n");}
  else { printf("pomilka\n")  ;   exit(0)  ;}
fseek(fp2,sizeof(float),0);
if((fread(&a1,sizeof(float) ,2,fp2)!=1)){
printf("pom")    ;
}

system("pause");}

Я щось так пробував ,але не вийшло

4 Востаннє редагувалося P.Y. (09.06.2018 16:15:11)

Re: Проблема з функцією fseek()

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

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

5 Востаннє редагувалося Віталій_Боднар (09.06.2018 17:12:49)

Re: Проблема з функцією fseek()

Можете написати, бо я недуже добре розумію як працює fread і fwrite.

6

Re: Проблема з функцією fseek()

Будь ласка, використовуйте теги code (на перший раз зробив за вас). І вирівнюйте код, я, наприклад, таку мішанину взагалі читати не буду. У практично всіх сучасних IDE є засоби автоматичного форматування коду, якщо ліньки руками, і в мережі є інструменти для цього.

7 Востаннє редагувалося P.Y. (09.06.2018 19:42:05)

Re: Проблема з функцією fseek()

Віталій_Боднар написав:

Можете написати, бо я недуже добре розумію як працює fread і fwrite.

Обидві функції мають чотири параметри: вказівник, розмір, кількість, файл.
вказівник — це вказівник на змінну або масив, який треба скопіювати з файлу/у файл.
розмір — це розмір елемента масиву,
кількість — кількість таких елементів. Очевидно, ці два параметри перемножуються, і блок пам'яті відповідного розміру зчитується/записується за адресою, куди вказує вказівник.

Обидві функції повертають кількість елементів, які було насправді записано/прочитано (на випадок, якщо сталась помилка читання/запису, або програма при читанні дійшла до кінця файла).

Отже, якщо ми хочемо записати увесь масив b у файл, то треба зробити fwrite(b, sizeof(float), 9, fp2)
(і якщо результат не дорівнюватиме 9, це означає помилку — можна зробити перевірку, аналогічну тій, що при читанні).
Якщо прочитати один елемент у змінну — fread(&a1, sizeof(float), 1, fp2) — тобто, приблизно як ви написали в своєму коді, але, оскільки це проста змінна, її «кількість елементів» не може бути 2.

Р.Ѕ. Там вище я дав посилання на опис функції fwrite — можете перейти по ньому й почитати (англійською, але там є все необхідне, навіть приклад коду).

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

8

Re: Проблема з функцією fseek()

Ще треба додати, що останній параметр функції fseek уточнює, з якого місця треба брати позицію: SEEK_SET - з початку, SEEK_CUR - з поточної позиції. Ви використовуєте числове значення SEEK_SET, що дуже незручно.

9

Re: Проблема з функцією fseek()

koala написав:

Ще треба додати, що останній параметр функції fseek уточнює, з якого місця треба брати позицію: SEEK_SET - з початку, SEEK_CUR - з поточної позиції. Ви використовуєте числове значення SEEK_SET, що дуже незручно.

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

10

Re: Проблема з функцією fseek()

Так я ж не кажу, що треба відраховувати від поточної позиції. Я кажу, що

fseek(fp2, sizeof(float), 0);

має незрозумілий параметр 0 в кінці, а

fseek(fp2, sizeof(float), SEEK_SET);

зрозуміліше.