【问题标题】:Inserting Data into text file in C++在 C++ 中将数据插入文本文件
【发布时间】:2017-09-16 08:31:01
【问题描述】:

我将数据插入到文本文件text file used in C++ programme

数据是这样的,但是应该是可读的形式。

这是程序

#include<iostream>
#include <fstream>
#include <Windows.h>
#include <string>

using namespace std;

class Record {
    private:
        int id;
        char name[50];
    public:

        void insert_data();
        void show_data();
};

void Record::insert_data() {
    cout << "\n\tName: ";
    cin.ignore();
    cin.getline(name, 50);

    cout << "\n\tID: ";
    cin >> id;
}

void Record::show_data() {
    cout << "\n\tName: ";
    cout << name;
    cout << "\n\tID: ";
    cout << id;
}

void write_info();
void show_info();

int main() {

    //write_info();
    show_info();

    cout << endl;
    system("pause");
}

void write_info() {
    Record info;
    ofstream data("data.txt", ios::app);
    info.insert_data();
    data.write((char *)(&info), sizeof(Record));
    data.close();
} // Function Ends here

void show_info() {
    Record info;
    ifstream data("data.txt", ios::app);
    data.read((char *)(&info), sizeof(Record));
    info.show_data();
    data.close();
}

为什么将这种类型的数据(不可读)输入到文本文件中? 请检查我的程序,如果由于这个不可读的数据而出现错误 在文本文件中。

【问题讨论】:

  • 您正在将原始内存写入文件。 int 将是 4 个字节的不可读数据(因为它不是作为文本存储在内存中,而是作为二进制补码存储)。然后会有一些可读的文本(取决于编码),但如果你的 name 不是 50 个字符长,那么在名称之后剩下的就是内存中的内容。由于您在调试模式下使用 Visual Studio 进行编译,因此未初始化内存的值为 0xCD,解码为 latin-1 时为 Í
  • 那我该怎么办?
  • 你想达到什么目的?如果你想要一个可读的格式,那么你需要定义确切的格式。如果你想要一个数字和一些文本,那么你需要考虑如何界定它
  • 我只想查看文本中的数据,我通过 c++ 程序输入的数据。此外,您在评论#1 中解释的观点能否给我任何清楚地描述我这一点的来源(文章、网址等),因为我没有明白这一点。

标签: c++ file


【解决方案1】:
ifstream data("data.txt", ios::app);

ios::app 是附加标志。不要将它与ifstream 一起使用。由于您正在读取二进制数据,因此请为 ofstreamifstream 使用 ios::binary 标志。

显然,您希望以文本形式保存数据(明智的选择)。改用data &gt;&gt; info.namedata &gt;&gt; info.id 写入数据。

您也可以使用std::string name 代替char name[50]。如果您想阅读整行,请使用std::getline

class Record {
public:
    int id;
    std::string name;
    void Record::insert_data() {
        cout << "Name: ";
        getline(cin, name); //reads the whole line
        cout << "ID: ";
        cin >> id;
    }

    void Record::show_data() {
        cout << "Name: " << name << ", ID: " << id << "\n";
    }
};

void write_info() {
    Record info;
    info.insert_data();
    ofstream data("data.txt", ios::app);
    data << info.name << "\n" << info.id << "\n";
} 

void show_info() {
    Record info;
    ifstream data("data.txt");
    while(true) {
        if(!data.good()) break;
        data >> info.name;
        if(!data.good()) break;
        data >> info.id;
        info.show_data();
    }
}

【讨论】:

  • 非常感谢,我明白你在说什么。但是请告诉我为什么我在文件中输入的数据不是可读的形式(但是文件的格式是文本)。我使用了 file.write((Char *) (&info),sizeof(Record)),为什么这一切都发生了,我无法理解。请详细说明这一点。非常感谢。
  • ofstream::write 的参数中的 (char*) 用作“演员”。它不会将任何内容转换为文本。它只要求编译器抑制错误警告。一个字节与“unsigned char”相同,这就是char* 的来源。地址&amp;info 的字节是逐字节写入的,这是二进制的,而不是将数字转换为ASCII 值的文本。跨度>
猜你喜欢
  • 1970-01-01
  • 2012-12-17
  • 1970-01-01
  • 2019-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多