C ++中序列模式二进制文件的问题

我的二进制文件有一个比较困难的问题。 有人问我,使存储在文件中的信息,但在连续模式的程序。 由于我不能直接修改顺序模式的东西,我做了一个函数,直到我找到了正确的注册表,在复制其他注册到一个辅助文件,首先读取文件。 当我完成修改我需要的东西,我把它复制到辅助文件和恢复复制。 完成后,我从辅助文件到原来的东西复制。 我做了这以下的二进制文件不同的例子,但我的计划做一些奇怪的事情。 它开始吃的都是我写的信息,只留下最后一个条目(类似于无限截断),比那更糟糕,有是启动一个没有意义的无限循环的一部分(贴上了“讨厌的部分”)(它就像该文件有无限大)我已经chacked像一千倍的逻辑,似乎我还没有找到任何错误,我不知道如果你能帮助我,如果我失去了一些重要的东西。

下面是我使用的类

class Cliente{ public: int numCuenta; char dni[10]; char nombre[40]; }; class Cuenta{ private: int numCuenta; double monto; int numDuenhos; public: const static double MONTO_MIN = 100.0; Cuenta(){ numCuenta = 0; monto = 0; numDuenhos = 0; } int getnumCuenta(){ return numCuenta; } void setnumCuenta(int numCuenta){ this->numCuenta= numCuenta; } int getnumDuenhos(){ return numDuenhos; } void setnumDuenhos(int numDuenhos){ this->numDuenhos= numDuenhos; } double getMonto(){ return monto; } void setMonto(double monto){ this->monto = monto; } };

和有问题的功能

void modificarCuenta() { Cuenta aux; Cliente c; ifstream rep_cuentas("cuentas.bin"); ofstream buf_cuentas("cuentas_rep.bin",ios::out | ios::trunc | ios::binary); if(!rep_cuentas) { cout <<endl << "Error al leer fila principal"; } else if(!buf_cuentas) { cout << endl << "Error al abrir el archivo buffer"; } else { cout <<endl << "Ingrese el numero de cuenta a modificar: "; //id of entry int num_cuenta; cin >> num_cuenta; ifstream rep_clientes("clientes.bin"); ofstream buf_clientes("cilentes_rep.bin",ios::out | ios::trunc | ios::binary); //este archivo es necesario, por eso termina si no lo lee if (!rep_clientes) { cerr << "Error al Abrir el Archivo de Clientes" << endl; return; } rep_cuentas.read(reinterpret_cast<char *>(&aux),sizeof(Cuenta)); while(!rep_cuentas.eof()){ if(aux.getnumCuenta() == num_cuenta){ rep_clientes.read(reinterpret_cast<char *>(&c),sizeof(Cliente)); while(!rep_clientes.eof()){ if(c.numCuenta == num_cuenta){ cout << "DNI del Cliente: " << c.dni << endl; //old dni cout << "Nombre del Cliente: " << c.nombre << endl; // old name cout << "Modificar estos datos? (1 para confirmar): "; int opc; cin >> opc; if (opc == 1){ c.numCuenta = aux.getnumCuenta(); cout << endl << "Ingrese nuevo DNI: "; //new dni cin >> c.dni; cout << endl << "Ingrese nuevo Nombre: "; //new name cin >> c.nombre; } } buf_clientes.write(reinterpret_cast<char *>(&c),sizeof(Cliente)); rep_clientes.read(reinterpret_cast<char *>(&c),sizeof(Cliente)); } int num = aux.getnumDuenhos(); while(true){ cout << endl << "Desea ingresar mas duenhos? (1 para confirmar): "; //appending new user? int op; cin >> op; if (op == 1){ c.numCuenta = aux.getnumCuenta(); cout << endl << "Ingrese nuevo DNI: "; //new dni cin >> c.dni; cout << endl << "Ingrese nuevo Nombre: "; //new name cin >> c.nombre; num++; buf_clientes.write(reinterpret_cast<char *>(&c),sizeof(Cliente)); } else{ aux.setnumDuenhos(num); break; } } } buf_cuentas.write(reinterpret_cast<char *>(&aux),sizeof(Cuenta)); rep_cuentas.read(reinterpret_cast<char *>(&aux),sizeof(Cuenta)); } rep_clientes.close(); buf_clientes.close(); } rep_cuentas.close(); buf_cuentas.close(); ofstream rcuentas("cuentas.bin",ios::out | ios::trunc| ios::binary); ifstream bcuentas("cuentas_rep.bin"); if(!rcuentas) { cout << endl << "Error al abrir la fila principal"; } else if(!bcuentas) { cout << endl << "Error al abrir el archivo buffer"; } else{ bcuentas.read(reinterpret_cast<char *>(&aux),sizeof(Cuenta)); while(!bcuentas.eof()){ rcuentas.write(reinterpret_cast<char *>(&aux),sizeof(Cuenta)); bcuentas.read(reinterpret_cast<char *>(&aux),sizeof(Cuenta)); } rcuentas.close(); bcuentas.close(); ofstream rclientes("clientes.bin",ios::out | ios::trunc | ios::binary); ifstream bclientes("clientes_rep.bin"); bclientes.read(reinterpret_cast<char *>(&c),sizeof(Cliente)); //pesky part while(!bclientes.eof()){ rclientes.write(reinterpret_cast<char *>(&c),sizeof(Cliente)); bclientes.read(reinterpret_cast<char *>(&c),sizeof(Cliente)); } //end of pesky part bclientes.close(); rclientes.close(); cout << endl << "Modificacion Realizada con Exito" << endl; //confirmation text } }

在你需要它的情况下,这是写一个新项功能,工作完全正常:

void crearCuenta(){ Cuenta aux; aux.setnumCuenta(0); ifstream rcuentas("cuentas.bin"); if(!rcuentas){ cout<< endl <<"Primer uso del Sistema detectado, generando numero de cuenta inicial" <<endl; } else { rcuentas.read(reinterpret_cast<char *>(&aux),sizeof(Cuenta)); while(!rcuentas.eof()){ rcuentas.read(reinterpret_cast<char *>(&aux),sizeof(Cuenta)); } rcuentas.close(); } Cuenta cu; cu.setnumCuenta(aux.getnumCuenta() + 1); int num_duenhos = 0; ofstream a_clientes("clientes.bin",ios::app |ios::binary); while(true){ char dni[10]; cout << "Ingrese el DNI del Duenho: "; //new dni Cliente c; cin >> c.dni; cout << "Ingrese el Nombre del Duenho: "; //new name cin >> c.nombre; c.numCuenta = cu.getnumCuenta(); num_duenhos++; a_clientes.write(reinterpret_cast<char *>(&c),sizeof(Cliente)); cout << "Desea ingresar otro duenho? (escriba 1 para confirmar): "; //another entry? int val; cin >> val; if (val != 1) break; } cu.setnumDuenhos(num_duenhos); while(true){ double monto; cout << endl; cout << "Ingrese el monto con el cual iniciara la cuenta:"; //numerical value (greater than 100) cin >> monto; if (monto < Cuenta:: MONTO_MIN){ cout << "Debe ingresar un valor mayor a " << Cuenta::MONTO_MIN << endl; } else{ cu.setMonto(monto - monto * 0.005); break; } } ofstream acuentas("cuentas.bin",ios::app| ios::binary); if(!acuentas){ cout<< endl <<"ERROR en la fila secuencial" <<endl; } else{ acuentas.write(reinterpret_cast<char *>(&cu),sizeof(Cuenta)); acuentas.close(); } cout << "Cuenta Guardada Satisfactoriamente con número: " << cu.getnumCuenta() << endl; //confirmation text }

不要介意西班牙文本,它只是为用户通信。 任何帮助将不胜感激

--------------解决方案-------------

对于初学者来说,你不是以二进制方式打开输入,所以,除非你是在Unix下,你不会看到磁盘上的文件的字节图像。 如果我理解正确的话,你希望阅读你用相同的程序编写的文件; 如果是这样,阅读和写作在不同的模式将无法工作。

其次,你读,写复杂的数据结构( CuentaCliente使用) istream::readostream::write 。 这不起作用,除了少数极少数情况下。 无论二进制或文本,所有文件都有一个格式,这种格式必须在代码中得到尊重。 你的类或者是豆荚,或足够接近一个,那你可能看不出问题,直到你在开发环境中作出一些改变,但它仍然存在。 (你需要一个事实上reinterpret_cast这样做应该是一个红旗在这里。),它肯定是不行的(除了Unix下),如果您阅读或在文本模式下写的。 阅读文本模式这样写的文件,将返回其他字符,或者文件结束前停止,在Windows下。

另外, while ( file.eof() )不读的文件的正确的方法。 结果file.eof()是不可靠的,直到后输入已失败。 对于文本文件,您通常会使用:

while ( file >> something ) ...

要么

while ( std::getline( file, line ) ) ...

读为你做什么,

while ( rep_clentes.read(...) ) ...

应该工作,前提是你解决问题的其余部分。 这可能是你的无限循环的原因; 该istream是超过文件末尾一些其他原因的错误状态,所以eof()将永远不会成为现实。

分类:C# 时间:2012-01-01 人气:0
分享到:

相关文章

  • 无法读取的iOS联系人排序顺序(通讯录API似乎打破) 2012-11-11

    我试图用ABPersonGetCompositeNameFormat()来读取用户的地址簿中的排序顺序设置. 它总是返回kABPersonCompositeNameFormatFirstNameFirst不管是如何配置设置应用程序"显示订单"的偏好. 地址簿应用程序的变化时,相应的显示顺序设置为"最后一",但API调用总是返回表示"第一个最后"显示顺序相同的值. 有没有人人都有这个问题? 我与iOS 4.3.3上的iPhone4运行此. ----

  • iOS版:顺序互动 2014-09-02

    前言:我是很新的Objective-C和我做一些简单的练习,以作为开发进展学习. 比方说,我们在玩记忆游戏. 开始时你有两个图像:一头牛和一头猪. 一个字显示(牛或猪)并单击相应的按钮. 我的问题:我如何进步用户四张牌六等上? 游戏中准水平,我想......或者更简单. 第二个问题:如果是简单的一个静态套牌(4件),我怎么让成功的消息和董事会的复位之间的时间? 我问更多的假设,但确切的答案将是有益的太多,所以我可以更多的了解语法. 如果这是混乱的,我很抱歉. :)任何信息欢迎! --------

  • iOS 5的观看赛事订货变化 2014-08-07

    有没有人注意到,在查看事件在iOS 5的触发顺序发生了变化? 使用标签栏从一个视图切换到另一个,在iOS 4的顺序是:"viewWillDisappear",然后"viewWillAppear中". 在iOS 5中,他们被切换. 是否有可能使用的iOS 5,但有事件以前的订单? --------------解决方案------------- 这是真的. 看来这个标签的viewDidLoad现在被称为应用程序委托的didFinishLaunchingWithOptio

  • N体模拟C ++ 2012-09-30

    我想实现的2维n -身体模拟的OpenMP的版本. 但有一个问题:我假设每个粒子的初始速度和加速度是零. 当粒子第一次聚集在一起,他们会驱散掉在高速,不再聚. 这似乎并不符合牛顿定律一致的,对不对? 有人可以解释为什么发生这种情况,我怎么能修复这个错误? 这里是我的代码部分: /* update one frame */ void update() { int i, j; omp_set_num_threads(8); # pragma omp parallel private(j) { # p

  • Windows以iPhone二进制文件 2013-02-08

    它是安全的从Windows传递二进制文件被写入iPhone一样: std::ostream stream = // get it somehow stream.write(&MyHugePODStruct, sizeof(MyHugePODStruct)); 和阅读这样的: std::istream stream = // get it somehow stream.read(&MyHugePODStruct, sizeof(MyHugePODStruct)); 虽然定义MyHugePOD

  • 我可以使用PayPal在iPhone / iPad应用程序? 2013-05-21

    我的工作,通过它我想卖掉一些活动门票的应用程序. 我可以使用PayPal用于此目的,并且苹果公司将使用其他的StoreKit框架批准的应用程序. 我搜索了这个话题,但我无法找到任何可能的解决方案. 某些搜索说,贝宝可以使用另说,苹果从来没有批准使用非inA​​ppPurchase其它支付网关的应用程序. 请帮帮我! --------------解决方案------------- 是的...你可以使用PayPal支付网关与应用程序. 你可以看到从下面的链接中的完整文档.... https://cm

  • 什么是推送通知警报文本的最大长度? 2015-02-01

    什么是iOS的推送通知的警报文本的最大长度? 该文件指出,通知有效载荷必须下共256个字节,但肯定必须有警报文本的特定字符的限制. --------------解决方案------------- 该警报文本的实际限制不记录任何地方. 该文件说的唯一的事情就是: 在iOS系统中8和更高版本,允许一个通知有效载荷的最大尺寸是2千字节; 苹果推送通知服务拒绝任何超过这一限制的任何通知. (在此之前到iOS 8和OS X中,最大有效载荷大小为256字节). 这是我能找到做一些实验. 快讯:在此之前到iO

  • 在客户端上CoreData Server的排序顺序(IOS) 2012-02-06

    我开发与核心数据的iOS应用. 从服务器和更新CoreData的应用程序争夺数据. 在数据库中的记录被在服务器上更新/排序顺序. 什么是保存在客户端上的排序顺序的最佳解决方案? 正在存储的排序顺序另一列的最佳解决方案? 该数据将在服务器上发生变化. --------------解决方案------------- CoreData(目前)不保留排序顺序. 如果有一个自然的排序顺序,你做它取(按名称,日期等IE),否则你需要订货("指数")添加到您的对象模型. 注意:这可能不是在附近的将来

  • 如何设置在iOS中的Tab键顺序? 2012-03-02

    有没有一种方法(在IB或代码)设置在视图中的文本字段的Tab键顺序? 请注意,我不是回来后谈论下一个表单字段(或"下一步")按钮 - 许多蓝牙键盘有一个tab键,通过完全不同的顺序领域似乎周期. 在我的特定情况下,该顺序不对应于这些字段的视图中或甚至在其中加入的字段的顺序位置. 手工修改XIB文件来改变NSNextKeyView似乎不有所作为无论是. 没有人知道如何改变这种秩序? --------------解决方案------------- 我感兴趣的解决同样的问题,虽然到目前为止默

  • 什么是对iOS应用程序的启动方法的执行顺序? 2013-08-27

    当iOS应用程序第一次启动时,有什么方法,什么顺序执行? 做一些方法优先于他人? --------------解决方案------------- 你可以有一个过程详细解释从下面的链接, http://bill.dudney.net/roller/objc/entry/demystifying_iphone_app_startup 或者你可以采取的帮助从这里

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.313 (s). 10 q(s)