在C ++中读取文件时,如何自动将char放入字符数组并将数字放入整数变量?

时间:2018-08-05 07:54:10

标签: c++ file-handling

#include <fstream>
#include <iostream>
#include <string.h>
#include <stdio.h>
using namespace std;

class akh {
public:
    char name[20];
    int age;
};

int main() {
    akh ak;
    cout << "Size of ak:" << sizeof(ak) << endl;
    fstream fout("abc.dat", ios::binary | ios::out);
    cout << "\nEnter your name: ";
    cin.getline(ak.name, 20);
    cout << "\nEnter your age: ";
    cin >> ak.age;

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

    fstream fin("abc.dat", ios::in | ios::binary);
    fin.read((char*)&ak, sizeof(ak)); // automatically puts name in ak.name and age in ak.age ? How is this happening?
    cout << "\nName: " << ak.name;
    cout << "\nAge: " << ak.age;
    fin.close();

    return 0;
}
  1. 这是怎么回事?另外,如果我在文本文件中有“ myName19”,并且 开始阅读,然后自动将myName放入char中,并将19放入 整数变量。
  2. 关闭文件后,tellg指针自动移动到 文件?
  3. 除了二进制文件以外,还有其他方法可以读写吗? ((char *)&x,sizeof(x))??

1 个答案:

答案 0 :(得分:0)

  
      
  1. 这是怎么回事?
  2.   

您正在按原样将类akh的完整内存布局写入二进制文件。
因此,如果以相同的方式并以相同的字节数读回它,则ak实例中的存储器布局将相同。

  
      
  1. 关闭文件后,tellg指针会自动移动到文件的开头吗?
  2.   

否,调用tellg之后不再维护close()指针。

对于输入,您要打开一个新的fstream实例fin,该实例将从文件的开头开始读取。

  
      
  1. 除了((char *)&x,sizeof(x))以外,还有什么其他方法可以读写二进制文件?
  2.   

对于二进制文件如前所述,您要写入和读取字节在内存中的确切排列方式。

如果要在文本文件中使用人类可读的字符,请使用格式化的文本运算符<<进行输出,并使用>>进行输入。


当我运行您的代码时,您遇到的问题就很清楚了。您正在使用的std::getline()变体从输入到ak.name的20个字符中完全正确:

cin.getline(ak.name, 20);

您可以通过将上面的行替换为

来解决此问题
cin >> ak.name;

在输入时在姓名和年龄之间留一个空格。

Here是一种解决方案,其中的所有操作均按预期进行,并显示二进制文件的内存布局。