- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我需要按顺序读取和写入同一个文件(没有 seekg 和 seekp)但出于某种原因 .write 不起作用!
这是我的类(class)
class student
{
int id ;
char name[20] ;
int m1 , m2 , m3 ;
public:
student()
{
}
student(int idd , char*n , int mm1 , int mm2 , int mm3 )
{
id = idd ;
strcpy(name , n);
m1 = mm1 ;
m2 = mm2 ;
m3 = mm3 ;
}
void show()
{
cout<<"student id : "<<id<<endl<<"student name : "<<name<<endl<<"mark 1 : "<<m1<<endl<<"mrak 2 : "<<m2<<endl<<"mark 3 : "<<m3<<endl ;
}
void get()
{
cout<<"enter student id : " ;
cin>>id ;
cout<<"enter student name : " ;
cin.ignore() ;
cin.get(name , 20) ;
cout<<"enter student's mark 1 :" ;
cin>>m1 ;
cout<<"enter student's mark 2 :" ;
cin>>m2 ;
cout<<"enter student's mark 3 :" ;
cin>>m3 ;
}
};
这是我的主要功能:
int main()
{
fstream file("f://records.dat" , ios::out | ios::in |ios::binary ) ;
if(!file)
{
cout<<"Error !";
int z ;
cin>>z ;
return 4 ;
}
modify(file);
int x ;
cin>>x ;
return 0 ;
}
这是我的功能:
void modify(fstream &file)
{
int recnum ;
cout<<"enter the number of the record to be modified : " ;
cin>>recnum ;
file.seekg(0) ;
file.seekp(0);
student s1 ;
for(int i = 0 ; i<recnum-1 ; i++)
{
file.read((char *) &s1 , sizeof(s1)) ;
}
int x = file.tellp() ;
int y = file.tellg() ;
cout<<x<<endl<<y<<endl ;
student s2 ;
s2.get() ;
file.write((char *) &s2 , sizeof(student))
x = file.tellp() ;
y = file.tellg() ;
cout<<x<<endl<<y<<endl ;
file.flush() ;
file.seekg(0 , ios::beg);
if(file.eof())
{
cout<<"error !" ;
int x ;
cin>>x ;
}
while(file.read((char *) &s1 , sizeof(student)))
{
s1.show() ;
}
}
似乎方法修改中的写入函数不起作用所以请任何人帮助我?????
最佳答案
问题是双向文件流都持有一个 union 缓冲区,其中输入和输出都对下一个要读取的字符产生影响和写入。例如,当读取完成时,输出 位置指示器也会随着读取的字符数增加。
在您的modify
函数中,您在执行read
之后直接执行write
,而没有将输出位置指示器设置回0。这应该总是为了收到预期的结果而完成。
输出后输入也是如此:不要忘记设置 seekg
位置指示器。
关于如果没有 seekg 和 seekp,c++ fstream write 不适用于二进制文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19872187/
我正在尝试制作一个随机名称生成器。问题是为了获得文件中的行数,我必须遍历它。 所以当我需要在 getRandomName() 中再次循环获取名称时,它已经到达文件末尾 我尝试使用 seekg(0, s
我有一个文本文件: 1 2 3 4 5 6 7 8 9 我想用seekg()读取一个特定的数字 ifstream fr("duomenys.txt"); fr.seekg(2,ios::beg); i
在下面的代码中,我计算了字数、行数,然后计算了文本文件的大小。第一次使用 seekg 在第一个 while 循环后工作正常,但在第二个 while 循环后,它不起作用。它给出输出中所示的值。 #inc
我有一个非常大的 (950GB) 二进制文件,我在其中存储了 10 亿个 float 序列。 我拥有的长度为 3 的文件类型的一个小例子可能是: -3.456 -2.981 1.244 2.453 1
我有一个 2884765579 字节的文件。这是用这个函数双重检查的,它返回那个数字: size_t GetSize() { const size_t current_position
#include #include int main() { std::string str; char magic[9]; std
我有一个小程序,旨在从文件中复制一个小短语,但似乎我对 seekg() 的工作方式有误,或者我的代码阻止函数按预期工作。 文本文件包含: //Intro previouslyNoted=false 这
我有一个函数(遗留)读取文件的前几行以确定其类型,然后关闭并重新打开文件,以便它可以使用正确的解释器重新读取整个文件。要点是: void readFile(const char *filename)
我正在使用 Visual C++ 2010 开发 MFC 应用程序 我正在读取一个文件的数据,但似乎 seekg 不工作 这是我的代码 //Transaction is a class i have
所以我尝试使用 cin.get() 两次读入一串字符。输入被重定向为“程序 int main() { std::cin.seekg(1, std::ios::beg); if (std::ci
在对文件使用 seekg 和 tellg 的场景中,我想知道幕后发生了什么? // Open file and get file size int myFileSize; st
在尝试以文本模式 (Windows) 读取一个简单的 ANSI 编码文本文件时,我遇到了 seekg() 和 tellg() 的一些奇怪行为;任何时候我尝试使用 tellg(),保存它的值(作为 po
我正在尝试编写一些简单的代码来读取文本文件,但会读取第一行两次。我认为这会像这样简单 std::ifstream file; file.open("filename", std::io
所以,我很好奇,因为我一直在使用这种相当有用的方法来获取文件的大小,但有些事情困扰着我。将流锁定到文件系统上的文件和 fileStream.seekg(0, std::ios::beg); int b
我正在玩 ifstream 以熟悉它。我正在尝试使用 seekg 来判断文件的位置,但它给了我错误的结果。 想法是: 打开文件 打印文件位置 从文件中读取一个字符 打印文件位置 从文件中读取一个字符
下面的程序应该输出如下内容: Begin found space found End found 但事实并非如此。 #include #include #include #include #i
我正在尝试备份 ifstream 中的一行。 file.tellg() 正在返回一个我没有预料到的值。在下面的示例中,在读取第一行(长度为 15 个字符的字符串)后,我希望 file.tellg()
我正在尝试从特定偏移量读取二进制数据。 我是这样写数据的: long RecordIO::writeRecord(Data *record) { this->openWrite();
代码如下: #include #include #include using namespace std; int main(int argc, char *argv[]) { string
我正在尝试将 bmp 文件读入字符缓冲区,并使用进程间通信将其传输到进程间。我使用以下代码完成了此操作: std::ifstream ImageFile; char* str=ne
我是一名优秀的程序员,十分优秀!