Тема: Проблема з функцією fseek()
Умова задачі:
Задати масив дійсних чисел розмірністю 9, записати його в файл на диску, прочитати з нього в змінні 2-ий, 5-ий і 8-й елементи масиву. Значення цих елементів вивести на екран.
Ви не увійшли. Будь ласка, увійдіть або зареєструйтесь.
Ласкаво просимо вас на україномовний форум з програмування, веб-дизайну, SEO та всього пов'язаного з інтернетом та комп'ютерами.
Будемо вдячні, якщо ви поділитись посиланням на Replace.org.ua на інших ресурсах.
Для того щоб створювати теми та надсилати повідомлення вам потрібно Зареєструватись.
Український форум програмістів → C++ → Проблема з функцією fseek()
Сторінки 1
Для відправлення відповіді ви повинні увійти або зареєструватися
Умова задачі:
Задати масив дійсних чисел розмірністю 9, записати його в файл на диску, прочитати з нього в змінні 2-ий, 5-ий і 8-й елементи масиву. Значення цих елементів вивести на екран.
У мене невиходить з функцією 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]
Я щось так пробував ,але не вийшло
По-моєму, тут проблема в тому, що дані записуються функцією fputs (яка працює з рядками символів, але тут їй передано масив float, тому вона запише лише частину масиву до першого нульового байта, а решту пропустить). Використовуйте fwrite(), яка якраз і розрахована на роботу з двійковими файлами в парі з fread().
Можете написати, бо я недуже добре розумію як працює fread і fwrite.
Будь ласка, використовуйте теги code (на перший раз зробив за вас). І вирівнюйте код, я, наприклад, таку мішанину взагалі читати не буду. У практично всіх сучасних IDE є засоби автоматичного форматування коду, якщо ліньки руками, і в мережі є інструменти для цього.
Можете написати, бо я недуже добре розумію як працює fread і fwrite.
Обидві функції мають чотири параметри: вказівник, розмір, кількість, файл.
вказівник — це вказівник на змінну або масив, який треба скопіювати з файлу/у файл.
розмір — це розмір елемента масиву,
кількість — кількість таких елементів. Очевидно, ці два параметри перемножуються, і блок пам'яті відповідного розміру зчитується/записується за адресою, куди вказує вказівник.
Обидві функції повертають кількість елементів, які було насправді записано/прочитано (на випадок, якщо сталась помилка читання/запису, або програма при читанні дійшла до кінця файла).
Отже, якщо ми хочемо записати увесь масив b у файл, то треба зробити fwrite(b, sizeof(float), 9, fp2)
(і якщо результат не дорівнюватиме 9, це означає помилку — можна зробити перевірку, аналогічну тій, що при читанні).
Якщо прочитати один елемент у змінну — fread(&a1, sizeof(float), 1, fp2) — тобто, приблизно як ви написали в своєму коді, але, оскільки це проста змінна, її «кількість елементів» не може бути 2.
Р.Ѕ. Там вище я дав посилання на опис функції fwrite — можете перейти по ньому й почитати (англійською, але там є все необхідне, навіть приклад коду).
Ще треба додати, що останній параметр функції fseek уточнює, з якого місця треба брати позицію: SEEK_SET - з початку, SEEK_CUR - з поточної позиції. Ви використовуєте числове значення SEEK_SET, що дуже незручно.
Ще треба додати, що останній параметр функції fseek уточнює, з якого місця треба брати позицію: SEEK_SET - з початку, SEEK_CUR - з поточної позиції. Ви використовуєте числове значення SEEK_SET, що дуже незручно.
Чому ж, для даної конкретної задачі, де файл є копією масиву, відраховувати номер елемента від початку якраз зручніше.
Так я ж не кажу, що треба відраховувати від поточної позиції. Я кажу, що
fseek(fp2, sizeof(float), 0);
має незрозумілий параметр 0 в кінці, а
fseek(fp2, sizeof(float), SEEK_SET);
зрозуміліше.
Сторінки 1
Для відправлення відповіді ви повинні увійти або зареєструватися