程序写入记录在 C++ 的二进制文件中两次
Program writing record twice in a binary file in c++
请检查代码是否有错误,因为它在文件中写入了两次记录。我认为错误可能是由于eof()
功能造成的。为了以防万一,我也提供了类描述。
class student
{
int sno;
char sname[20];
float fees;
public:
void input()
{
cout << "enter sno,sname and fees n";
cin >> sno;
gets(sname);
cin >> fees;
}
void output()
{
cout << sno << "t" << sname << "t" << fees << "n";
}
int rsno()
{
return sno;
}
}s;
void add()
{
ofstream f1;
f1.open("stu.dat", ios::binary | ios::app);
s.input();
f1.write((char*)&s, sizeof(s));
f1.close();
}
void displayall()
{
ifstream f2;
f2.open("stu.dat", ios::binary);
while (!f2.eof())
{
f2.read((char*)&s, sizeof(s));
s.output();
}
f2.close();
}
void main()
{
add();
displayall()
}
看起来你还没有声明student
的实例,所以你必须在调用它的方法之前这样做;
student s;
s.input();
顺便说一下,该代码乍一看似乎不起作用
我认为代码太少,无法给出任何声明。s 是学生实例吗?您是否尝试以这种方式将其转换为字符数组?我认为您应该首先使用一些序列化。
顺便说一句。这是我见过的最丑陋的格式 - 非常不可读
必须先在函数中声明类student
的对象/实例,然后才能调用它。您错误地假设通过创建类并为其提供别名,您现在可以使用 s.input
调用它。您必须在要使用的函数中声明它。 student stu;
或s stu;
在void add()
函数开始时。
另外,由于您使用的是C++,我强烈建议您使用getline
甚至fgets()
而不是gets
因为后者是 C 函数,并且使用起来也很旧且不安全。如果你这样做,我建议你看看一起使用Cin和Getline。如果您不想搞砸换行符,处理换行符非常重要。
谢谢大家,但我想出了答案。问题是在使用 eof() 函数时有某种缓冲区,这就是我得到重复结果的原因。
相关文章:
- 如何使用C++一次读取整个二进制文件
- 无法一次从二进制文件中读取一个 int
- C++两次从文件保存对象读取多重继承
- 带有文件结束函数的 while 循环重复输出文件中的最后一个数字两次
- 在 NDK 上编译两个带有 gradle 的项目,其中一个依赖于另一个的二进制文件
- 如何使用预处理器指令包含两次具有不同代码的文件?
- 使用字符串流逐行读取文件两次
- C OOP,读取文件的问题,EOF使用了两次,排行榜
- Qfiledialog:文件夹名称在Windows下方出现两次
- 是否值得两次通过文件进行迭代,以创建最小的数据结构
- 为什么输入文件的最后一行运行两次?
- 在同一目录下编译两组C 二进制文件
- 为什么在这里对c++输入文件流进行两次检查
- 锁定文件,避免使用相同的过程以访问两次
- 尽管 #ifndef,但包含两次头文件
- CppUnit 和 CMake:.cpp文件被编译两次
- 正在从文件中读取最后两次出现的内容
- 流将所有内容写入我的文件两次
- 程序写入记录在 C++ 的二进制文件中两次
- 执行两次写入文件功能