文字列である「名前」(文字の配列)とバイト配列である「データ」(C++での文字の配列)を含むファイルを作成する必要がありますが、最初に直面した問題は「名前」を分離する方法です「データ」から?この場合、改行文字は機能しますが (名前に「\n」が含まれていないと仮定します)、「データ」部分に特殊文字を含めることができるため、いつ終了するかを知る方法がないため、 「データ」のサイズを持つデータの前のファイルの int 値! 私は次のようなコードでこれをやろうとしました:
if((fp = fopen("file.bin","wb")) == NULL)
{
return false;
}
char buffer[] = "first data\n";
fwrite( buffer ,1,sizeof(buffer),fp );
int number[1];
number[0]=10;
fwrite( number ,1,1, fp );
char data[] = "1234567890";
fwrite( data , 1, number[0], fp );
fclose(fp);
しかし、「int」の部分が正しいかどうかわからなかったので、これを含む他の多くのコードを試しました:
char buffer[] = "first data\n";
fwrite( buffer ,1,sizeof(buffer),fp );
int size=10;
fwrite( &size ,sizeof size,1, fp );
char data[] = "1234567890";
fwrite( data , 1, number[0], fp );
ファイルを開くと、整数ではなく 4 つの「NULL」文字が表示されます。それは正常ですか?私が直面している他の問題は、ファイルから再度読み取ることです! 私が読み取ろうとしたコードはまったく機能しませんでした:( 「fread」で試しましたが、「fseek」を使用する必要があるのか 、それともその後の他の文字を読み取るだけなのかわかりません.
クラスを次のように使用してから、それを書き込んで読み返すことを考えました:
class Sign
{
public:
char* name;
int size;
char* data;
};
しかし、それはC++では簡単なことではありませんでした!!
私も次のことを試しました:
void saveData(char* filename) {
fstream filestr;
int n;
n=10;
char* data= "1234567890";
filestr.open (filename, fstream::out | fstream::binary);
for (int j = 0; j<5 ; j++)
{
filestr << n;
for (int i = 0; i < n; i++) {
filestr << data[i];
}
}
filestr.close();
}
void readData(char* filename) {
fstream filestr;
int n =0;
filestr.open (filename, fstream::in | fstream::binary);
int m =0;
//while(!filestr.eof())
while(m<5)
{
filestr >> n;
char *data = new char[n];
for (int i = 0; i < n; i++) {
filestr >> data[i];
}
printf("data is %s\n",data);
m++;
}
filestr.close();
}
しかし、読み取りもうまくいきませんでした。
読んでいると、奇妙な文字が表示されます。
これまでのところ、私のために機能するコードは次のとおりです。
void saveData(char* filename) {
fstream filestr;
char * name = "first data\n";
int n;
n=10;
char* data= "asdfghjkl;";
filestr.open (filename, fstream::out | fstream::binary);
for (int j = 0; j<5 ; j++)
{
filestr << name;
filestr << strlen(data);
filestr << data;
}
filestr.close();
}
void readData(char* filename) {
fstream filestr;
int n =0;
filestr.open (filename, fstream::in | fstream::binary);
while(!filestr.eof())
{
string name;
getline(filestr,name,'\n');
printf("name is %s\n",name.c_str());
filestr >> n;
char *data = new char[n];
for (int i = 0; i < n; i++) {
filestr >> data[i];
}
printf("n is%d\ndata is %s\n",n,data);
}
filestr.close();
}
しかし、読書の問題は次のとおりです。
1-(実際の問題ではないと思います)実際のデータに加えて他の文字を出力します。2-readData
関数で出力を6回取得します(前回はすべてのフィールドを空のフィールドとして取得しました)が、5回しか書き込みませんでした!それがなぜなのか、誰もが知っていますか?それは関係ありますwhile(!filestr.eof())
か??
手伝ってくれてありがとう