- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个采用 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。
由于设置了故障位,seekg
和read
都没有做任何有用的事情。流位置没有被修改,没有数据被读取,缓冲区也没有被修改。
因此,当程序将 buffer
发送到 std::cout
时,它发送的是之前在 buffer
中的内容。如果显示的代码位于位置 1,则第四条记录仍将位于 buffer
中。否则,buffer
将包含一个“0”,后跟 NUL,因为它已被初始化为那个。 (0 和 '0' 不一样。)
这完美地解释了观察到的行为。在执行 seekg 之前,您需要清除 input
的 failbit。
其实while
循环也是不正确的。读取最后一个条目后,input
仍将是 good
,循环将重复。 read
将失败,留下 id
未修改,但由于您不检查,程序将继续使用伪造的 id。现在“输入”为假,解析失败。
如果 read
或 seekg
失败,您需要做的是退出循环。 input
的 bool 转换的显式测试完全没有必要,也没有用,因为来得太迟了。
关于c++ - 文件 I/O 不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34554087/
我是一名优秀的程序员,十分优秀!