为什么这个函数无法往文件中写入数据void inputdata() { ofstream file("stud.dat",ios::app); int num; string data; cout << "要输入数据的数目:"; cin >> num; for (int i = 1; i <= num; i++) { cout << "第" << i << "个学生(学号 姓名 成绩):"; getline(cin, data); cout << data; file<<data<<endl; } file.close(); }
时间: 2024-03-24 11:36:05 浏览: 63
可能是因为在输入数据之前,还有一个输入操作,即输入要输入数据的数目,这个输入操作会留下一个回车符在缓冲区中,导致getline函数在读取数据时会读取到这个回车符,从而导致输入数据不完整。可以在输入要输入数据的数目后,再加上一句`cin.ignore();`来清空缓冲区中的回车符,使得getline函数能够正确读取数据。修改后的代码如下:
```
void inputdata()
{
ofstream file("stud.dat", ios::app);
int num;
string data;
cout << "要输入数据的数目:";
cin >> num;
cin.ignore(); // 清空缓冲区中的回车符
for (int i = 1; i <= num; i++)
{
cout << "第" << i << "个学生(学号 姓名 成绩):";
getline(cin, data);
cout << data;
file << data << endl;
}
file.close();
}
```
相关问题
void delete_add(Contacts obj){ ofstream outFile; outFile.open("1.dat",ios::binary|ios::app); outFile.write((char*)&obj,sizeof(obj)); outFile.close(); } int del_one(char name[50]){ ifstream inFile; int flag = 0; inFile.open("Contacts.dat",ios::binary); Contacts obj; while(inFile.read((char*)&obj,sizeof(obj))){ if(strcmp(obj.getName(),name) == 0) { flag = 1; cout<<"删除成功:"<<endl; }else{ delete_add(obj); } } if(flag == 0){ cout<<"无此联系人,删除失败!"<<endl; }else{ return 1; } inFile.close(); }添加注释
//定义一个函数,将联系人对象写入文件中
void delete_add(Contacts obj){
ofstream outFile; //定义一个输出文件流对象
outFile.open("1.dat",ios::binary|ios::app); //以二进制和追加的方式打开文件
outFile.write((char*)&obj,sizeof(obj)); //将联系人对象写入文件
outFile.close(); //关闭文件流
}
//定义一个函数,用于删除指定姓名的联系人
int del_one(char name[50]){
ifstream inFile; //定义一个输入文件流对象
int flag = 0; //标记是否找到要删除的联系人
inFile.open("Contacts.dat",ios::binary); //以二进制的方式打开文件
Contacts obj; //定义一个联系人对象
while(inFile.read((char*)&obj,sizeof(obj))){ //循环读取文件中的联系人对象
if(strcmp(obj.getName(),name) == 0) //如果找到了要删除的联系人
{
flag = 1; //将标记设为1,表示找到了
cout<<"删除成功:"<<endl; //输出提示信息
}else{
delete_add(obj); //将不需要删除的联系人对象写入临时文件中
}
}
if(flag == 0){ //如果没有找到要删除的联系人
cout<<"无此联系人,删除失败!"<<endl; //输出提示信息
}else{
return 1; //返回1,表示删除成功
}
inFile.close(); //关闭文件流
}
while (true) { int bytes = recv(sockConn, buffer, 2048, 0); if (bytes <= 0) break; fileSize += bytes; // 将接收到的视频数据写入到.avi文件中 std::ofstream videoFile("server_video.avi", std::ios::binary | std::ios::app); videoFile.write(buffer, bytes); videoFile.close(); } VideoWriter writer("server_video.avi", cv::VideoWriter::fourcc('M', 'J', 'P', 'G'), 25.0, Size(640, 480)); if (writer.isOpened()) { writer.write(videoData); }为什么这段代码无法正常打开视频
这段代码中的问题在于在每次循环中都会打开并关闭文件流。这会导致文件指针不会在每次循环迭代之间保持一致,从而导致无法正确写入视频数据。解决方法是将文件流的打开和关闭放在循环外部,只在开始时打开文件流,在循环结束后关闭文件流。以下是修改后的代码示例:
```cpp
std::ofstream videoFile("server_video.avi", std::ios::binary | std::ios::app);
while (true) {
int bytes = recv(sockConn, buffer, 2048, 0);
if (bytes <= 0) break;
fileSize += bytes;
videoFile.write(buffer, bytes);
}
videoFile.close();
VideoWriter writer("server_video.avi", cv::VideoWriter::fourcc('M', 'J', 'P', 'G'), 25.0, Size(640, 480));
if (writer.isOpened()) {
writer.write(videoData);
}
```
请注意,视频数据的来源(videoData)在你提供的代码中没有明确指定,你需要根据实际情况将其添加到代码中。此外,还要确保 OpenCV 库已正确链接和配置。
阅读全文