如何使用文件处理更改对象中变量的值?

How do I change the value of a variable in an object with file handling?

我正在处理一个带有 oop 和文件处理的项目,我需要一个 changeQuantity() 方法来传递项目名称和数字(正数或负数)。我想用这个方法更改数量,并将更改写入文件。

我的对象:

    class Item(){
        int itemId, quantity;
        char title[25], type[10];
        float price;
        public:
            void changeQuantity(char*, int);
    };

我正在使用的 changeQuantity() 方法:

    void Item::changeQuantity(char* name, int quan){
        fstream file;
        file.open("filename.txt", ios::in | ios::out);
        //after finding the object to work on
        this->quantity += quan;           
        file.seekp(file.tellp() - sizeof(*this)); 
        file.write((char*)this, sizeof(*this)); 
    }

我试过这个方法,但它弄乱了整个文本文件。我怎样才能只更改数量变量并将更改写入文件而不影响其他任何东西????? 任何形式的帮助将不胜感激。谢谢。

PS:我在这里要做的只是更改存储在txt文件中的对象中的quantity变量的值。我正在使用的代码弄乱了 txt 文件。

你好像在混合苹果和橘子。您从大小为 *this 的文本文件中读取了一些内容;但是您将它以二进制模式读入对象的二进制存储中。当它写出来时,它仍然是你的对象的二进制格式。正确的方法:

  1. 以文本模式打开文件,并使用 gets 和 puts(不安全且容易出错)读取和写入所有内容。读入时将每个数字从文本翻译成二进制。
  2. 最好读入std::string个变量;因为它更强大,更不容易出错。经典的 C++ 方法是例如来自 Input/output with files 的示例:
// reading a text file
#include <iostream>
#include <fstream>
#include <string>
using namespace std;

int main () {
  string line;
  ifstream myfile ("example.txt");
  if (myfile.is_open())
  {
    while ( getline (myfile,line) )
    {
      cout << line << '\n';
    }
    myfile.close();
  }

  else cout << "Unable to open file"; 

  return 0;
}

您需要调整它以读取和翻译(例如,从文本数字格式到变量)对象的每个成员。我不知道大众阅读的方法,例如将文本文件中的文本行转换为对象的成员。一旦它是二进制格式并正确读入您的对象,您就可以将我们的对象写出到这样的二进制文件中;但请注意:它们不会是固定大小的,因此您需要先写出对象的大小,然后再写出对象本身;然后读取对象的大小,然后读取对象本身。

简而言之,您正在使用二进制文件访问方法,例如你的整数是文本而不是可能的 32 位二进制文​​件,你的字符串是 \n\n\r 而不是 null 终止。处理对象文本输入和输出的典型方法是为每个成员设置一个文本行,并一次翻译一个;或以 CSV 或 JSON 格式读写它们 - 每个成员一次一个;然后遍历文件。

顺便说一句:在这个例子中使用 using std; 被认为是错误的形式。为了防止 std 命名空间中的东西干扰您的变量和例程,最好使用 using std::string; 等;对于您想从 std 命名空间访问的每件事。

我从 file.open() 方法中删除了除文件名之外的参数。由于 fstream 已经有默认参数 ios::in | ios::out,我删除了它并且它按照我想要的方式工作。但它并不是 100% 的时间都有效。有时它仍然重复这个问题,我一直没能找到原因。