2014-06-06 6 views
-1

J'ai écrit ce code. Dans ce programme, je lis un fichier puis verse une partie du fichier dans le char * temp. Enfin char * temp écrit dans le fichier. J'ai un problème. Quand j'écris temp dans le fichier seulement 4 caractères écrits dedans. Que dois-je faire?pourquoi écrire la fonction ne fonctionne pas correctement?

fstream file; 
file.open("mary.txt",ios::in); 
file.seekg(-1,ios::end); 
int pos=file.tellg(); 
char ch; 
char c; 
int i=0; 
char * temp=new char[100]; 
file.seekg(0,ios::beg); 
while(pos >=0) 
{ 

    file.read(&ch,sizeof(char)); 
    if(ch=='a'||ch=='o'||ch=='u'||ch=='e'||ch=='i'||ch=='A'||ch=='O'||ch=='U'||ch=='E'||ch=='I') 
    { 
     pos--; 
     continue; 
    } 
    else if(ch>='a' && ch<='z') 
    { 
     c=ch-32; 
     temp[i]=c; 
     i++; 
    } 
    else 
    { 
     temp[i]=ch; 
     i++; 
    } 
    pos--; 
} 
temp[i]=NULL; 
cout<<temp<<endl; 
cout<<" sizeof temp:"<<sizeof(temp)<<endl;//out put is 4 while temp has longer size!! why? 
fstream f("test.txt",ios::trunc); 
f.write(temp,sizeof(temp));//if the file contains "abcdeifjle" only written "abcd" 
+1

Utilisez 'strlen (temp)', pas 'sizeof (temp)' –

+0

'sizeof (temp)' vous donne la taille de la variable de pointeur, qui en fait semble être 4 octets pour votre environnement actuel (32 bits). –

+0

Utilisez strlen au lieu de sizeof et n'oubliez pas d'appeler les méthodes flush et close à la fin. –

Répondre

0

vous pouvez utiliser strlen(temp)

sizeof(temp) 

vous donnera la taille du pointeur

Pointeurs ont généralement une taille fixe, par ex. sur un exécutable 32 bits, ils sont généralement en 32 bits. Il y a quelques exceptions, comme sur les vieilles fenêtres de 16 bits où vous deviez distinguer les pointeurs 32 bits et 16 bits ... Il est généralement assez sûr de supposer qu'ils seront uniformes dans un exécutable donné sur les systèmes d'exploitation de bureau modernes. .

3

temp est un pointeur; sizeof(temp) correspond à la taille d'un pointeur, soit 4 octets sur votre plate-forme 32 bits.

Pour obtenir la longueur de la chaîne de style C il pointe, utiliser std::strlen(temp)

Mieux encore, utilisez std::string plutôt que tout ce pointeur jonglerie bizarre. Cela va corriger la faille de mémoire et la vulnérabilité buffer-overrun dans votre code; et probablement quelques bugs moins évidents aussi. Il est rarement une bonne raison d'écrire C++ comme s'il s'agissait de C.

+0

si j'utilise une chaîne de caractères comment le convertir en char *? Parce que je devrais donner le type de données char * pour le premier argument de la fonction d'écriture. – raha

+0

@ user3703177: 'f.write (temp.c_str(), temp.size())' ou 'f << temp'. –

Questions connexes