gpt4 book ai didi

c++ - 文件 I/O 不一致

转载 作者:行者123 更新时间:2023-11-28 02:14:10 25 4
gpt4 key购买 nike

我有一个采用 ID 和记录位置的数据类型。该文件包含大约 1000 个项目,每个项目包含 id、名字、姓氏、GPA(每个项目总共 25 个字符)我的程序为每个循环寻找 25 个字符,只取 ID,将 ID 和记录号放入表中,等等。

然后,用户输入id,我根据给定的id从表中检索item,然后得到记录号,在文件中查找item,然后读取详细信息。

提供了 recordslocation 和 arrayhashtable 类的标题,删除了一些内容以使其更短

class  RecordLocation{
public:
RecordLocation(int idd = -1, int rno = -1);
void setId(int);
int getId();
void setRNo(int);
int getRNo();
int Hash();
int LinearRehash(int initial_hash_value);
private:
int id;
int r_no;
};

/

    typedef RecordLocation ItemType;
class ArrayHashTable{ //declares a class data type

public:
ArrayHashTable();//Fill info with null studnets
Error_Code RetrieveItem(ItemType& item, bool& found);
Error_Code InsertItem(ItemType item);
Error_Code DeleteItem(ItemType item);
void PrintAllItems();
private:
ItemType info[MAX_ITEMS];
int items;
};

/数据.txt短版

4609:hhhhh    hhhhh   :2:4737:ggggg    ggggg   :4:5530:rrrrr    rrrr   :4:4849:ttttttt tttttttttt:2:5563:ddddd    dddd    :2:4959:aaaa    aaaaaaa  :4:

/

void main(){    
char buffer[26] = { '0' };
char id_buff[5];
int id;
ArrayHashTable object;
RecordLocation temp;
ifstream input("data.txt");
if (!input){
cout << "Unable to open file " << endl;
exit(1);
}

int i = 0;
int c;

//location 1
do{
input.seekg(25 * i);
input.read(id_buff, 4);
id = convert(id_buff);

temp.setId(id);
temp.setRNo(i);
object.InsertItem(temp);

i++;

}while (input);

//location 2

input.close();
}

现在令人困惑的是以下声明:

input.seekg(25 * 3);//3 is arbitrary
input.read(buffer, 25);
cout << buffer << endl;

如果要放在位置1,那么就是正常输出。如果在位置2则输出为0,如果同时在位置1和2则输出正常。

解决方法是把do while语句写完,然后关闭文件再打开,执行语句就一切正常了。但这不是一个明智的解决方案。

我基本上想说的是,我读完了文件,之后似乎无法从中获取更多信息。我也没有添加向用户询问 ID 的部分(以使其更简单)

最佳答案

如果对 input.read 的任何调用失败,您的程序永远不会注意到,因为您从不检查 read 方法的返回码。所以我们必须弄清楚发生了什么,而不是看到它。幸运的是,在这种情况下这并不太难,但一般来说,如果您养成检查错误返回的习惯,您会发现生活会更轻松。

我们知道,当到达位置 2 时,input 的 failbit 被设置。这一定是真的,因为 while 循环不会退出直到 input 为 false。

由于设置了故障位,seekgread 都没有做任何有用的事情。流位置没有被修改,没有数据被读取,缓冲区也没有被修改。

因此,当程序将 buffer 发送到 std::cout 时,它发送的是之前在 buffer 中的内容。如果显示的代码位于位置 1,则第四条记录仍将位于 buffer 中。否则,buffer 将包含一个“0”,后跟 NUL,因为它已被初始化为那个。 (0 和 '0' 不一样。)

这完美地解释了观察到的行为。在执行 seekg 之前,您需要清除 input 的 failbit。


其实while循环也是不正确的。读取最后一个条目后,input 仍将是 good,循环将重复。 read 将失败,留下 id 未修改,但由于您不检查,程序将继续使用伪造的 id。现在“输入”为假,解析失败。

如果 readseekg 失败,您需要做的是退出循环。 input 的 bool 转换的显式测试完全没有必要,也没有用,因为来得太迟了。

关于c++ - 文件 I/O 不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34554087/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com