2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 Не удаётся прочитать файл с помощью fscanf //C++
Сообщение11.11.2008, 19:16 
Написал программу, которая должна создавать и считывать float файл, но почему-то вместо того, чтоб считывать, программа входит в бесконечный цикл... Может, кто-нибудь знает в чём дело?

Код:
#include <assert.h>
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <stdlib.h>

main()
{
FILE * fp;
float p,q,y;
int i=0;
int n=1;

clrscr();

fp=fopen("data-float.dat","w+");

if (fp==NULL)
{
    printf("Cannot create file\n");
    return 0;
}

float *temp;
float *array;
temp = new float [n];
assert(temp!=0);

array = new float [n];
assert(array!=0);

printf("Insert float numbers. To end press 'e'\n");

for (;;)
{
    p = scanf("%f\n",&q);

    if (p==0)
    {
     break;
    }
    fprintf(fp,"%f\n",q);
}

fclose(fp);

fp=fopen("data-float.dat","r");

if (fp==NULL)
{
    printf("Cannot open the file\n");
    return 0;
}


while (!feof(fp))
{
fscanf(fp,"%.4f",&y);// вот здесь программа отказывается читать из файла
array[i]=y; // и естественно, не передаёт никакого значения в array[i]
i++;
    for (int j=0; j<i; j++)
    {
     temp[j]=array[j];
    }

delete []array;
array = new float [i];
assert(array!=0);
  for (j=0; j<i; j++)
  {
   array[j]=temp[j];
  }
delete []temp;
temp = new float [i];
assert(temp!=0);
}

for(int j=0; j<i; j++)
{
  printf("%f5.2 \n",array[j]);
}


fclose(fp);

delete []array;
delete []temp;

getch();
return 0;
}


Там, где программа не хочет читать, смотрел из-под дебаггера - значение y как далось программой из мусора, так и остаётся, а i возрастает бесконечно.

 
 
 
 
Сообщение11.11.2008, 19:50 
Аватара пользователя
t3rmin41 в сообщении #157427 писал(а):
 fscanf(fp,"%.4f",&y);// вот здесь программа отказывается читать из файла


можно поинтересоваться,что означает
Код:
"%.4f"

 
 
 
 
Сообщение11.11.2008, 20:11 
Внутри формата printf это означает что-то типа "вывести четыре знака после запятой". А внутри scanf - не знаю, что такое. Мне тоже это подозрительно.

 
 
 
 
Сообщение12.11.2008, 09:42 
Аватара пользователя
В функциях типа scanf такая запись действительно не работает. Допускается указывать только целое число, которое определяет максимальное количество символов для данного поля.

См. http://msdn.microsoft.com/en-us/library/kwwtf9ch.aspx

Рекомендую привыкнуть всегда проверять возвращаемое значение этих функций и обрабатывать любые нетипичные ситуации (как ранее в программе сделано для функции scanf).

 
 
 [ Сообщений: 4 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group