WebHU - Programozási kérdések és válaszok

Fájlok olvasása és írása C++ nyelven egész számról egészre

Van egy kódrészletem egy tömb elemeinek fájlba írásához (sorosítás), majd visszaolvasásához (deserialize) Itt van:

#include<stdio.h>

void serialize(int *arr,int n,FILE *fp)
{
    int i=0;
    for( ; i<=n-1 ; i++)
        fprintf(fp,"%d ",arr[i]); // The elements of array go into the file
}

void deserialize(FILE *fp)
{
    int temp;
    while(1)
    {
        if(fscanf(fp,"%d",&temp))
            printf("%d ",temp);        // The Contents of file tree.txt are written to console
        else
            break;
    }
}


int main()
{
    int arr[] = {20,8,-1,-1,22,-1,-1};

    FILE *fp = fopen("tree.txt", "w");
    if (fp == NULL)
    {
        puts("Could not open file");
        return 0;
    }
    serialize(arr,n, fp);
    fclose(fp);

    fp = fopen("tree.txt", "r");
    deserialize(fp);
    fclose(fp);
    return 0;
}

Hogyan lehet ezt elérni az ofstream és az ifstream objektumokkal C++-ban?


  • Nem világos, mi a kérdésed. Először is a programod nem fordít le. Másodszor, nem fogja azt csinálni, amit leírtál. Tehát a stream objektumok használata értelmetlen lenne. 25.11.2015
  • 1. Győződjön meg arról, hogy az egész számok el vannak választva, valószínűleg szóközökkel. 2. Győződjön meg arról, hogy a fscanf() (vagy bármely más használt) sikeres volt. 25.11.2015
  • @mkaes.. elnézést.. Problémám volt a soronkénti másolásnál és a formázásnál.. Most már rendben van a kód. Ennek a kódnak csak a másolás-beillesztését tudom lefordítani 25.11.2015
  • @DietmarKühl.. Hello.. Megcsináltam az általad említett 1-et és 2-t is 25.11.2015

Válaszok:


1

Az objektumfolyamok operátorának túlterhelése túlterhelést igényel egy adott típushoz. Ez azt jelenti, hogy be kell csomagolnia az egyéni tömböt, például így

struct my_array
{
   int *arr;
   int n;
};

majd definiálja a túlterheléseket

std::ostream& operator<<(std::ostream& os, const my_array& foo)
{
   //same as serialize
   int i=0;
   for( ; i<=foo.n-1 ; i++)
      os << foo.arr[i];
   return os;
}

std::istream& operator>>(std::istream& is, my_array& dt)
{
    //do something 
    return is;
}

Probléma van a kóddal. a szerializálás és a deszerializálás nem szigorúan inverz műveletek. Ez annak a ténynek köszönhető, hogy olvasás közben fogalma sincs, hány értéket kell elolvasnia. Így az adatok sorozatosítása, majd valami más és visszaolvasás mindig sikertelen lesz.

fstream s;
my_array a;
bar b;
s << a << b;
...
my_array x;
bar y;
s >> x >> y; //endof, failbit set

Itt nem csak y ! = b, hanem x != a. A sérülés sértésének fokozása érdekében a x és a y tartalma eltérő lesz akár c++11-es vagy.

25.11.2015

2

Más megközelítést is használhat: ostream_iterator és istream_iterator

#include <fstream>
#include <iostream>
#include <iterator>
#include <algorithm>

int main(int, char **)
{
  int arr[] = {20,8,-1,-1,22,-1,-1};

  // write to console
  std::copy(arr, arr + 7, std::ostream_iterator<int>(std::cout, " "));

  // write on file
  std::cout << std::endl << "Writing on file" << std::endl;

  std::ofstream myOfile("./out.dat");

  if (myOfile.is_open())
  {
    std::ostream_iterator<int> out_iter(myOfile, " ");
    std::copy(arr, arr + 7, out_iter);

    myOfile.close();
  }

  // read from file
  std::cout << std::endl << "Reading from file" << std::endl;

  std::ifstream myIfile("./out.dat");

  if (myIfile.is_open())
  {
    std::copy(std::istream_iterator<int>(myIfile),
              std::istream_iterator<int>(),
              std::ostream_iterator<int>(std::cout, " "));

    myIfile.close();
  }

  return 0;
}
25.11.2015
Új anyagok

A rádiógomb ellenőrzött eseményének használata a jQueryben
Ebben a cikkben látni fogjuk, hogyan kell dolgozni a jquery választógombbal ellenőrzött eseményeivel. A választógombok HTML gombok, amelyek segítenek kiválasztani egyetlen értéket egy csoportból...

Körkörös függőségek megoldása terraformban adatforrásokkal – lépésről lépésre
Mi az a körkörös függőségek Dolgozzunk egy egyszerű eseten, amikor az SQS-sor és az S3-vödör közötti körkörös függőség problémája van egy egymástól függő címkeérték miatt. provider..

Miért érdemes elkezdeni a kódolást 2023-ban?
01100011 01101111 01100100 01100101 — beep boop beep boop Világunk folyamatosan fejlődik a technológia körül, és naponta fejlesztenek új technológiákat a valós problémák megoldására. Amint..

🎙 Random Noise #2  – Örökbefogadás és hit
az analitika íratlan világának gondozása Szeretné, hogy ezek a frissítések a postaládájába kerüljenek? Iratkozzon fel itt . "Ha önvezető autókat gyártanak, akkor mi miért ne..

A legrosszabb politika és prediktív modellek májátültetésre jelöltek számára az Egyesült Államokban
A máj (vagy óangolul lifer) az emberi test legnehezebb belső szervére utal, amely csendesen működik a nap 24 órájában. Mit csinál a máj? 500 feladatot hajt végre a szervezet egészségének..

5 webhely, amely 2022-ben fejleszti front-end fejlesztői készségeit
Frontendmentor.io A tényleges projektek létrehozásával a Frontendmentor.io segítséget nyújt a front-end kódolási képességeinek fejlesztésében. A kódolást azután kezdheti meg, hogy..

Mikor kell használni a Type-t az interfészhez képest a TypeScriptben?
A TypeScript a JavaScript gépelt szuperkészlete, amely statikus gépelést ad a nyelvhez. Ez megkönnyíti a robusztus és karbantartható kód írását azáltal, hogy a hibákat a fordítási időben..