文件IO打印到屏幕
File IO Printing to screen
我的老师给了我们几周前的一个实验的答案,它和我提交作业时使用的不一样。我将这段代码弹出到我的地址簿程序中,但是没有打印出来,我想知道是否有人知道如何从主界面将这段代码打印到屏幕上。我尝试了一些方法,但我能做的最好的是打印出一个条目,而不是其他条目。下面是我们得到的代码:
void addressBook::showAll2(string fName)
{
PERSON p;
PEOPLE2 tp;
ifstream inData(fName.c_str(), ios::in);
if(inData.fail())
throw AddressBookException("Cannot open file to read ");
people.clear();
int i = 0;
while(!inData.eof())
{
inData.seekg(i * sizeof(PEOPLE2));
inData.read(reinterpret_cast<char *>(&tp), sizeof(PEOPLE2));
p.fName = tp.fName2;
p.lName = tp.lName2;
p.Address = tp.Address2;
people.push_back(p);
i++;
}
inData.close();
return;
}
我唯一改变的是抛出异常(我们当前的项目)。这曾经是一个bool函数,它会返回真或假。我们没有得到main的代码,因为他不关心那个部分,所以我们很少得到它。我想知道有没有人知道怎么把这个打印到屏幕上。我试着把它改成这样:
void addressBook::showAll2(string fName, string &str)
{
PERSON p;
PEOPLE2 tp;
ifstream inData(fName.c_str(), ios::in);
if(inData.fail())
throw AddressBookException("Cannot open file to read ");
people.clear();
int i = 0;
while(!inData.eof())
{
inData.seekg(i * sizeof(PEOPLE2));
inData.read(reinterpret_cast<char *>(&tp), sizeof(PEOPLE2));
p.fName = tp.fName2;
p.lName = tp.lName2;
p.Address = tp.Address2;
people.push_back(p);
i++;
inData >> str;
}
inData.close();
return;
}
在main中我有这个:
void printFile() //prints stored file info to screen
{
string str;
addressBook *newBook = addressBook::newbookInst();
Menu *m = Menu::menuInst();
try
{
newBook->showAll2("addressbook", str);
cout << str << '/n' << endl;
}
catch(exception e)
{
cerr << e.what();
}
m->waitKey();
}
有没有人愿意告诉我我错过了什么?作业已经完成了,所以如果你愿意,可以详细解释一下,或者直接写邮政编码,我就能算出来了。我有点疯狂了,我想弄明白我是怎么把这段代码打印出来的。(顺便说一句,我的版本工作得很好,但没有做任何这些。)由于
你的教授的代码是错误的,因为它在错误的地方测试eof,它还做了不必要的查找,我担心你的教授写的是错误的代码。
while(!inData.eof())
{
inData.seekg(i * sizeof(PEOPLE2));
inData.read(reinterpret_cast<char *>(&tp), sizeof(PEOPLE2));
...
}
应该这样写
for (;;)
{
inData.read(reinterpret_cast<char *>(&tp), sizeof(PEOPLE2));
if (inDate.eof())
break;
...
}
你应该在之后测试eof ,而不是在之前。这在新手中是一个很常见的错误,但你的教授不应该犯这个错误。其次,不需要seekg,因为您只是从头到尾遍历文件。这不是bug,但也没必要。
inData.close
也是不必要的,因为ifstream析构函数将为您关闭文件。
对你的问题的回答很简单:
inData.read(reinterpret_cast<char *>(&tp), sizeof(PEOPLE2));
p.fName = tp.fName2;
p.lName = tp.lName2;
p.Address = tp.Address2;
cout << p.fName << ' ' << p.lName << ' ' << pAddress << 'n';
用你教授的循环版本试试这段代码,你可能就会明白为什么会有bug了。
相关文章:
- 使用 SFML 和 C++ 将 Pixel 打印到屏幕上
- 使用 fstream 库并在屏幕上打印的文件有问题?
- UE4在屏幕上的打印位置
- Cout 一个字符串可以打印任何内容到屏幕上
- 如何在多维矢量中仅添加特定元素并将内容打印到屏幕
- 如何以CV_16UC1的方式读取JPG图像并在屏幕上打印?
- UNIX API 调用:使用 read() 函数打开文件并将其打印到屏幕上会增加额外的随机字符
- 作为参数传递的打印功能指针导致屏幕上打印"1"
- 在屏幕上打印 X 的形状
- 如何读取二进制文件并在屏幕上打印 3?
- 用putchar在屏幕上打印字符
- C / SFML:使用两个递归调用在屏幕上打印凸形形状仅显示第一个递归调用中的形状,而不是第二个
- 如何在不保存文件的情况下制作打印屏幕并将其发送到FTP服务器?我的工作代码将文件保存到HDD
- 如何在屏幕上打印2^20行C 的整数(1秒钟以下)
- 使用freopen()打印到文件和屏幕
- C++ 强制 std::cout 刷新(打印到屏幕)
- 无法在屏幕上打印 nullptr 的值
- 如何使用Qt/C++和各种显示器拍摄打印屏幕
- C++以二进制形式读取整个文件并将其打印在屏幕上
- 为什么这不会在屏幕上打印任何内容?