Jak w jezyku c++ wczytac z piku po kolei znak i przypisac kolejno do tablicy
zakładając że tenże plik masz w strumieni plik, to
#include <stdio.h>
char c;
int i=0;
int tab[100];
do {
c = getc (plik);
tab[i]=c;
i++;
} while (c != EOF);
Coś takiego powinno zadziałać.
Ten kod ma jakieś błędy, jest pewny że jest poprawny ?
#include <stdio.h>
#include <fstream>
int main()
{
char c;
int i=0;
int tab[100];
std::fstream plik;
plik.open( "c\\:plik.txt", std::ios::in | std::ios::out );
{
do
{
c = getc (plik);
tab[i]=c;
i++;
}while (c != EOF);
}
Podaj BŁĘDY wypluwane przez kompilator...
Wybaczcie ale dopiero zaczynam temat związany z obsługą plików:
in function 'int main()':
error: cannot convert 'const char*' to 'FILE' for argument '1' to 'int getc(FILE*)'
error: expected '}' at end of input
Wypadałoby chociaż zajrzeć do dokumentacji (http://www.cplusplus.com/reference/clibrary/cstdio/getc/)...
getc
oczekuje typu FILE
(a raczej wskaźnika na ten typ), podczas gdy Ty podajesz std::fstream
dzięki za dokumentację, poprawiłem program przez co teraz się kompiluje jednak przy starcie wyskakuje błą
#include <stdio.h>
#include <iostream>
using namespace std;
int main()
{
char c;
int i=0;
int tab[100];
FILE * pFile;
pFile=fopen ("c\\:plik.txt","r");
do
{
c = getc (pFile);
tab[i]=c;
i++;
}while (c != EOF);
cout << tab[1];
}
dodatkowo co oznacza "r" tutaj pFile=fopen ("c\:plik.txt","r"); ?
Po drobnej analizie edytowałem kod
#include <stdio.h>
#include <iostream>
using namespace std;
int main ()
{
FILE * pFile;
int c;
int tab[100];
int i=0;
pFile=fopen ("c:\\plik.txt","r");
if (pFile==NULL) perror ("Error opening file");
else
do
{
c = getc (pFile);
tab[i]=c;
i++;
}while (c != EOF);
cout << tab[0];
return 0;
}
Teraz jedynym problemem jest to że tab[0] do którego przypisany jest 1 znak/cyfra w pliku czyli w tym przypadku 1, zwraca wartość 49, czyl itablice zwracają błędne informację.
Och tak? A czy pierwszym znakiem w pliku nie jest '1'? Czyli znak o kodzie 49?
Jak dokonać konwersji ?
Shalom czemu po prostu nie zmienić typu na char ?
Ja zmieniłem i wszystko działa, bez zbędnego babrania się z tym atoi()
o_O? Spytałeś jak dokonać konwersji. Rozumiałem że chodzi o konwersję na liczby. Jak chcesz to tylko wypisać to w ogóle żadnej konwersji nie potrzeba.
bobo napisał(a):
Jak w jezyku c++ wczytac z piku po kolei znak i przypisac kolejno do tablicy
Plik tekstowy? Jeśli by założyć, że w pliku nie ma bajtów zerowych ('\0') to można to zrobić w ten sposób:
string tablica;
getline(ifstream("nazw_pliku"), tablica, '\0');
W ten sposób w do zmiennej tablica
trafią wszystkie znaki pliku aż do jego końca lub pierwszego znaku '\0' jeśli ten pojawi się wcześniej.
Binarnie razem z bajtami zerowymi? W ten sposób:
ifstream plik("nazw_pliku");
vector<char> tablica;
/* odczytujemy rozmiar pliku */
plik.seekg(0, ios::end);
unsigned rozmiar = plik.tellg();
plik.seekg(0, ios::beg);
/* wczytujemy bajty */
tablica.resize(rozmiar);
plik.read(&tablica.front(), rozmiar);