Zapis i odczyt tablicy doubla do pliku WinAPI

0

Witam. Mam taki problem, że chciałbym zapisać tablice double do pliku , a następnie ją odczytać. Czy mógłby mi ktoś pomóc i wskazać błędy w tym kodzie ? Wygląda na to, że do pliku zapisywany jest tylko pierwszy element :(

 #include <windows.h>
#include <cstdlib>
#include <cstdio>
#include <iostream>

using namespace std;

#define BYTEStoREAD  10
DWORD INVALID_SET_FILE = 0xFFFFFFFF;

int main()                                      // Plik1
{
DWORD OFFSET = 0, readed = 0;
HANDLE hFile;							// Uchwyt do pliku
double Wy[BYTEStoREAD];
double string[BYTEStoREAD];			// bufor Wy
for (int i=0;i<BYTEStoREAD;i++) string[i]=(double)(i+1)/ (double) (BYTEStoREAD+1);
char nameFile[33];
for (int i=0;i<BYTEStoREAD;i++) printf("%f   ", string[i]);


cout << "\nPodaj nazwe pliku" << endl << endl;
cin >> nameFile;


hFile = CreateFile(         // ------------utworzenie pliku do odczytu
     nameFile,                  // Nazwa pliku
     GENERIC_WRITE,			    // Tylko czytanie z pliku
     FILE_SHARE_WRITE,			// Wspoldzielenie czytania z pliku
     NULL,				  	    // Standardowe parametry bezpieczeństwa						
     CREATE_NEW,			    // Plik musi istnieć
     FILE_ATTRIBUTE_NORMAL,	    // Nie ma specyficznych atrybutów 
     NULL );                    // Nie korzystamy z obiektu template					
   if (hFile == INVALID_HANDLE_VALUE) {
            printf("CreateFile error %d.\n", GetLastError()) ;
            getchar(); return (1); }

BOOL wResult = WriteFile(      // -----------------------zapis do pliku
            hFile,	            
		    string, 			
			BYTEStoREAD, 		
			&readed, 			
			NULL) ; 			
   if (!wResult) { printf("ReadFile error %d.\n", GetLastError()) ;
                   getchar(); return (3); }

CloseHandle(hFile);

//************************************************************************************ TWORZENIE

hFile = CreateFile(         // ------------utworzenie pliku do odczytu
     nameFile,                  // Nazwa pliku
     GENERIC_READ,			    // Tylko czytanie z pliku
     FILE_SHARE_READ,			// Wspoldzielenie czytania z pliku
     NULL,				  	    // Standardowe parametry bezpieczeństwa						
     OPEN_EXISTING,			    // Plik musi istnieć
     FILE_ATTRIBUTE_NORMAL,	    // Nie ma specyficznych atrybutów 
     NULL );                    // Nie korzystamy z obiektu template					
     if (hFile == INVALID_HANDLE_VALUE) 
    {
        printf("CreateFile error %d.\n", GetLastError()) ;
        getchar(); return (1); 
    }
            
getchar();

BOOL bResult = ReadFile(      // -----------------------odczyt z pliku
            hFile,	            // Uchwyt pliku 
			Wy, 				// Tablica Wyjsciowa
			BYTEStoREAD, 		// Liczba bajtów do wczytania
			&readed, 			// pointer na liczbe wczytanych bajtów  
			NULL) ; 			// Operacja synchroniczna		
   if (!bResult) { printf("ReadFile error %d.\n", GetLastError()) ;
                   getchar(); return (3); }
												
if(readed == BYTEStoREAD) printf("Pelny Odczyt zakonczony pomyslnie\n");
   else printf("?? Wczytano %d ze %d bajtow zalozonych\n", readed, BYTEStoREAD);
   
for (int i=0;i<BYTEStoREAD;i++) printf("%f   ", Wy[i]);

CloseHandle(hFile);

getchar();
return 0;
}
1

Chyba sam nie pisałeś tych komentarzy :p Bo nawet w nich jest napisane, że przy pierwszym(drugim w sumie też) CreateFile() otwierasz go do odczytu to jak potem chcesz coś do niego pisać? Otwórz go do zapisu/odczytu i zapisu.

Przeczytaj też resztę komentarzy bo się przydadzą (: (protip: piąty parametr)

A tak, w ogóle, to jeżeli Twoim celem nie jest nauka winapi to polecałbym jednak fstreamy z STLa

+=
Zobacz przy zapisie i odczycie czy dobrze przekazujesz ile bajtów odczytac/zapisac bo BYTEStoREAD to nie jest rozmiar tablicy Twoich doubli w bajtach.

0

No właśnie miałem plik zrobiony, który tylko czytał z pliku stringa. Skopiowałem wczytywanie i przerobiłem na zapis do pliku i odczyt stringa i zadziałało. Teraz chce zrobić to samo, tylko na tablicy double, ale nie mogę nic wykombinować.

Plik otwieram oddzielnie dla zapisu i odczytu. Przy zapisie mimo, że w komentarzy pisze odczyt to creat file jest przerobiony na zapis.

0

Masz rację, nie popatrzyłem dokładnie na parametry.

I tak zobacz na moje wcześniejsze +=

0

Jesteś pewny, że nie wystarcza Ci to co oferuje biblioteka standardowa?

2
 char nameFile[33];

33 znaki to może być za mało. Użyj MAX_PATH.

 
#define BYTEStoREAD 10
double string[BYTEStoREAD]; // bufor Wy
BOOL wResult = WriteFile( // -----------------------zapis do pliku
        hFile,
        string,
        BYTEStoREAD,
        &readed,
        NULL);

Tu jest źle, ponieważ WriteFile przyjmuje ile bajtów wpisać. Tak więc powinno być: (BYTEStoREAD * sizeof(double)).
Poza tym nazwa "readed" nie jest trafiona, bo w tamtym miejscu to "zwraca" ile bajtów wpisano a nie odczytano. Nawet takiego słowa jak "readed" w j.angielskim nie ma. Przeszła forma to red jeśli się nie mylę.

0

Ok, dzięki za odzew :) Problem rozwiązany :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1