Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Чтение из файла


Автор: PandaRus 8.10.2007, 21:58
Как правильно читать из файла?
Код

/////////////////////////////////////////////////////////////////
float** G=new float*[1000];
    for(i=0;i<1000;i++)
        G[i]=new float[1000];
/////////////////////////////////////////////////////////////////
for(i=1; i<=k; i++)
{
    for(j=1; j<=k; j++)
        fprintf(outfile," %+12.10f ",G[i][j]);
    fprintf(outfile,"\n");
}
for(i=1; i<=k; i++)
    for(j=1; j<=k; j++)
        fscanf(outfile,"%f",G[i][j]); // - не работает - Unhandled exception at 0x1023817a (msvcr80d.dll) in Diplom2.exe: 0xC0000005:   Access violation writing location 0x00000000.


что необходимо исправить?

Автор: zkv 8.10.2007, 22:02
Цитата(PandaRus @  8.10.2007,  21:58 Найти цитируемый пост)
что необходимо исправить? 

в fscanf необходимо передавать адрес объекта:
Код

fscanf(outfile,"%f",&G[i][j]);

Автор: archimed7592 8.10.2007, 22:30
Раз пользуешься С++, то обрати внимание на намного более удобные(особенно в этом плане) потоки(#include <fstream>).

Автор: Rockie 10.10.2007, 14:24
Цитата(PandaRus @  8.10.2007,  21:58 Найти цитируемый пост)
что необходимо исправить?


Цитата(PandaRus @  8.10.2007,  21:58 Найти цитируемый пост)
for(i=1; i<=k; i++)    
   for(j=1; j<=k; j++)
        fscanf(outfile,"%f",G[i][j]); 

на 
Код
for(i=0; i<1000; i++)    
   for(j=0; j<1000; j++)
        fscanf(outfile,"%f",G[i][j]);

Нумерация с нуля, в противном случае ты выходишь за предел массива и справедливо получаешь
Цитата(PandaRus @  8.10.2007,  21:58 Найти цитируемый пост)
Access violation 


Автор: Lazin 10.10.2007, 14:48
Код

size_t Height = 1000, Width = 1000;
float G[] = new float[Height*Width];
//доступ по индексам
for (int ix = 0; ix != Width; ix++)
{
 for (int iy = 0; iy != Height; iy++)
 {
  G[ix + iy*Width] = ....
 }
}
//такой способ работы с 2х мерным массивом намного быстрее

//сохранение в  дамп
HANDLE hFile = CreateFile(
                            filename,
                            GENERIC_READ|GENERIC_WRITE,
                            FILE_SHARE_READ,
                            NULL,
                            OPEN_ALWAYS,
                            0,
                            NULL
                        );
DWORD bytes = 0;
WriteFile(hFile, (BYTE*)G,  (DWORD)(sizeof(float)*Height*Width), &bytes, NULL );//Сдесь происходит запись в двоичный файл всего массива
//или
//форматированный вывод
char buffer[4096];
for (int ix = 0; ix != Width; ix++)
{
 for (int iy = 0; iy != Height; iy++)
 {
   _snprintf(buffer, 4096, "%f, ", G[ix + iy*Width]);
   WriteFile(hFile, buffer, strlen(buffer), &bytes, NULL);
 }
}

а чтение зависит от формата файла в принципе, нужно сначала узнать размер массива, потом сделать чтение:
В случае текстового файла - 
Код

for (int ix = 0; ix != Width; ix++)
{
 for (int iy = 0; iy != Height; iy++)
 {
   fscan(outfile, "%f", &(G[ix + iy*Width]) );
 }
}

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)