1 Востаннє редагувалося #Sparta (26.03.2015 10:50:00)

Тема: Файли.

Усім привіт!
Прошу вашої допомоги. Мені потрібно, якщо не важко, пояснити в чому помилка?
Суть : потрібно зчитати одновимірний масив з файлу і вивести масив на екран.
Хочу зауважити, що на даний момент вивчаю чисто С. Тому , якщо можна, поясність з точки зору С.
Мій код наведений нижче.

#include<stdio.h>
#include<iostream>


void main()
{
    
    double *A = new double[];
    FILE *f;
    f = fopen("C:\\Users\\ARTUR\\Desktop\\lab2\\lab5\\lab5\\input.txt", "r+"); 
    for (int i = 0; i <= feof(f); i++)            /* Інтуїтивно розумію, що мабуть помилка тут
                                                    але яка?*/
        fscanf(f, "%lf", &A[i]);

    for (int i = 0; i < 100; i++)
    {
        printf("A[%d]=", i + 1);
        printf("%lf\n", A[i]);
    }
            system("pause");
        fclose(f);
 }

2

Re: Файли.

Щоб не вмикати інтуїцію, можна просто запустити і подивитись, що буде. Пробували?

Подякували: #Sparta1

3

Re: Файли.

Так, пробував.
Суть в тому , що данні не виводить коректно.
Тобто не всі числа.

4

Re: Файли.

Тут би приклад не завадив.
А ще мені не дуже подобається число 100, яке говорить вивести лише сотню чисел.

5

Re: Файли.

Я замінив його на 10 (просто для тесту перших 10 елементів нехай виведе) , але всерівно виводить не те , що потрібно :)
Ось скріншоти :

Post's attachments

Untitled1.png 4.46 kb, 274 downloads since 2015-03-26 

6

Re: Файли.

Результат :

Post's attachments

Untitled2.png 5.46 kb, 342 downloads since 2015-03-26 

7

Re: Файли.

Ок. Що робить специфікатор l в форматі fscanf?

8

Re: Файли.

Можливо , lf?
Він вказує,що данні, які будуть зчитуватись будуть дійсного типу.

9

Re: Файли.

Цікаве питання. Ввечері прийду додому, спробую щось зробити, якщо раніше ніхто не вирішить.

10

Re: Файли.

i <= feof(f);
Подивіться, що саме повертає feof - жодного сенсу порівнювати його з i немає.

Подякували: #Sparta1

11 Востаннє редагувалося VTrim (26.03.2015 13:28:00)

Re: Файли.

А ви пробували писати кожне число з нового рядка (в самому файлі)?
тобто
3
4
7
8
5

Дані ж зчитуються порядково.
А у вас все в одному. 5 6 4 3 2 5

Подякували: #Sparta1

12

Re: Файли.

Хочу зауважити, що на даний момент вивчаю чисто С.

Тоді треба викинути:

#include<iostream>

Цей інклуд потрібен лише в С++ — в чистому С його нема, та й Ваш код ніде не користується об'єктами з нього.

Подякували: #Sparta1

13 Востаннє редагувалося #Sparta (26.03.2015 13:46:10)

Re: Файли.

koala,а тоді до чого(якого значення) повинен працювати цикл,якщо наперед невідомо скільки там елементів?

Втрім, так пробував, програма працює аналогічно.Тобто та сама помилка.
P.Y., я знаю,що це С++, але мені це зручно, бо використовую system("pause");.

14

Re: Файли.

double *A = new double[];

З точки зору С, виглядає некоректно. Оператор new, наскільки я розумію, не є стандартним засобом чистого С (використовуйте malloc(sizeof(double)*кількість_елементів)). I якого розміру буде виділений безрозмірний масив? Спершу треба задати його розмір, а тоді вже щось у нього записувати. Якщо потім треба збільшити — виділяємо новий блок більшого розміру, копіюємо туди всі дані зі старого, старий знищуємо. А тут я навіть не розумію, як воно скомпілилось і який блок пам'яті виділило...

15

Re: Файли.

#Sparta написав:

P.Y., я знаю,що це С++, але мені це зручно, бо використовую system("pause");.

*WALL*  *WALL*  *WALL*  *WALL*  *WALL*  *WALL*  *WALL*  *WALL*  *WALL*  *WALL*

16

Re: Файли.

Хм, чесно кажучи навіть не подумав.
Дякую за пораду, в вечері спробую.
Відпишусь,якщо щось вийде.

17

Re: Файли.

koala, щось не так?

18

Re: Файли.

Щодо підозрілого циклу. Можна зробити так:

for (int i = 0; !feof(f); i++)

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

19 Востаннє редагувалося koala (26.03.2015 14:12:38)

Re: Файли.

Давайте розбирати...

#include<stdio.h>
#include<iostream>
//лишіть тільки одне, друге замініть на те, що вам реально треба. system знаходиться в stdlib.h, до речі.

void main()
{
    
    double *A = new double[]; /*це взагалі маячня - так не можна ані в C (там немає new), 
ані в C++ (new[] потребує розміру). 
Якщо треба заздалегідь невідомий об'єм - виділяйте потроху, а коли закінчується - збільшуйте, як робить std::vector*/
    FILE *f;
    f = fopen("C:\\Users\\ARTUR\\Desktop\\lab2\\lab5\\lab5\\input.txt", "r+"); //відносний шлях був би зручніший
    for (int i = 0; i <= feof(f); i++)  //   feof повертає не 0, коли вже була невдала операція читання, тому він незручний
        fscanf(f, "%lf", &A[i]);
/* краще так:
  while( fscanf( f, "%lf", &A[i++] ) == 1 ) //поки виходить прочитати 1 елемент
  {//тут якість дії, якщо i досягло кінця A, або взагалі пусте місце
  }
  втім, змінювати стан в перевірці ([tt]while(тобто ось тут)[/tt]) - теж погано, але це вже до стилю питання
*/
    for (int i = 0; i < 100; i++)//100 - чому саме 100? Ми хіба 100 прочитали?
    {
        printf("A[%d]=", i + 1);
        printf("%lf\n", A[i]);
       //а один printf не легше робити?
    }
            system("pause");//краще введіть якийсь непотрібний рядок. Створювати другий процес, значно складніший за ваш, тільки заради паузи...
        fclose(f);//а звільняти ресурси краще тоді, коли вони стають непотрібні, тобто в цьому випадку - одразу після читання; втім, справа смаку.
 }
Подякували: quez, 0xDADA11C72

20

Re: Файли.

#Sparta написав:

koala, щось не так?

system є і в чистому С. Для чого тут С++?

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