char指针文件I / O.

时间:2014-04-11 07:14:24

标签: c++ file pointers char

需要格式化,编辑需要一些时间。

3 个答案:

答案 0 :(得分:0)

该文件只有16个字节,因为当你向文件写a.p时,你正在写一个四字节指针值,它指向内存中的字符串 - 你本身并没有写出字符串数据。

它似乎工作的原因是你在同一个进程中立即将相同的指针值读回另一个指针变量,所以当你读取bp指向的内存时,它与指向的内存相同。 ap,即以NUL结尾的字符串文本。

如果您创建了第二个只读取文件的程序,而没有声明字符串文本,那么您应该会遇到错误,或者至少看不到文本。

int main() 
{
    string filepath("C:\\Users\\Chitra\\Desktop\\New folder\\Project1\\Project1\\test.txt");

    fstream fin(filepath,ios::in|ios::binary);

    struct block 
    { 
        int value; 
        int size; 
        const char* p; 
        int some;
    };

    block b;
    fin.read((char*)&b, sizeof(b)); 
    fin.seekg(0, ios::end);

    cout << "file size " << fin.tellg();
    fin.close();

    cout << "\n  size b " << sizeof(b);
    cout << "\n"<<b.value << "  " << b.size << "  " << b.p << "  " << b.some;
    getchar();  

    return 0;
}

答案 1 :(得分:0)

正如Sam Mikes所说block.p是指针并且你只保存它的值(指针的值是它所指向的内存的地址)并且由于ap仍然指向它在内存中内存不会改变添加delete a;代码如下所示,并看到不同的

*注意到:a和b和block的大小相同,你可以使用sizeof(a) or sizeof(b) or sizeof(block)代替

#include <string>
#include<iostream>
#include <fstream>
using namespace std;
int main(){
string text("C:\\Users\\Chitra\\Desktop\\Capture.JPG"); 
string filepath("C:\\Users\\Chitra\\Desktop\\New folder\\Project1\\Project1\\test.txt");
fstream fout(filepath,ios::out|ios::binary); 
fstream fin(filepath,ios::in|ios::binary);

struct block { 
   int value; 
   int size; 
   const char* p;
   int some;
};
block a;
a.value =1457745;
a.size=text.length();
a.p=text.c_str();
a. some=97877;

fout.write((char*)&a,sizeof(a)); 
fout.close();

delete a.p;

block b;
fin.read((char*)&b,sizeof(b)); 
fin.seekg(0,ios::end);
cout<<"file size "<<fin.tellg();
fin.close();
cout<<"\nsize a "<<sizeof(a)<<"  size b "<<sizeof(b)<<"  size block "<<sizeof (block);
cout<<"\n"<<b.value<<"  "<<b.size<<"  "<<b.p<<"  "<<b.some;
getchar();  
return 0;

}

答案 2 :(得分:0)

你不能只做......

fout.write(pointer, bytes);

...用于 pointerbyte的任何值,因为数据不存在于连续内存中。 必须分别在没有指针的情况下写入嵌入在block中的数据,以及指向的字符串数据。如果将指针移动到结构的末尾,那么这是最简单的,然后写:

struct block 
{ 
    int value; 
    int some;
    int size; 
    const char* p; 
};

fout.write((char*)&a, sizeof a - sizeof a.p);
           // could also "offsetof(block, p)" for size - possibly more fragile
fout.write(a.p, a.size);

然后,回读数据:

block b;
fin.read((char*)&b, sizeof b - sizeof b.p);
b.p = new char[b.size + 1];
fin.read(b.p, b.size);
b.p[b.size + 1] = '\0';  // guarantee NUL termination

稍后您需要delete[] b.p;取消分配new[]返回的内存。或者,您可以使用其他string

block b;
fin.read((char*)&b, sizeof b - sizeof b.p);
std::string b_string(b.size, ' ');  // initially b.size spaces
fin.read(&b_string[0], b.size);     // overwrite with data from the file...

使用std::string时,在调用析构函数时会自动发生释放。

(实际上最好使用带有std::fstream的C ++序列化库,例如boost's here。)