我一直在为当地的地方制作一个节目,这是一个计算应该订购多少披萨的程序。然而,问题甚至不是计算,而是保存登录的文件。数据。
#include <iostream>
#include <stdlib.h>
#include <iomanip>
#include <fstream>
using namespace std;
string logs[20];
void test(ifstream& IN, string logs[], ofstream& OUT);
void introduction();
int logging_in(string id, string logs[]);
void menu();
string newl = "\n";
string dnewl = "\n\n";
string tnewl = "\n\n\n";
string qnewl = "\n\n\n\n";
string pnewl = "\n\n\n\n\n";
int main()
{
ifstream IN;
ofstream OUT;
string id;
IN.open("loginn.dat");
cout << IN.is_open();
test(IN, logs, OUT);
string sup;
int receive = 0;
introduction();
return 0;
}
void test(ifstream& IN, string logs[], ofstream& OUT)
{
for (int x = 0; x < 20; x++)
{
IN >> logs[x];
}
IN.close();
OUT.open("loginn.dat");
for (int x = 0; x < 20; x++)
{
OUT << logs[x] << " " << "hue" << " ";
}
}
void introduction()
{
string cont;
cout << "Hello. I am the..." << dnewl
<< "Statistical" << newl << "Pizza" << newl
<< "Order" << newl << "Amount" << newl
<< "Diagnostic." << dnewl
<< "Otherwise known as Pizzahand. I will be assisting you to estimate the \namount of pizza that is to be ordered for <INSERT NAME>, as to \neliminate excessive ordering."
<< tnewl;
cout << "Press Enter to continue..." << newl;
cin.get();
}
理论上,这应该输出数组&#34; logs []&#34;在执行其余代码之前。除了main函数之外我没有函数的情况就是这种情况。一旦我开始使用我的下一个函数&#34; introduction()&#34;,这里读取文本文件的代码
for (int x = 0; x < 20; x++)
{
IN >> logs[x];
}
似乎被打破了。似乎它在程序的最后完成,而不是在程序的最后完成它,因为我已经通过输出其内容进行测试,同时程序仍在读取&#34; test()&#34;,没运气。然后,在main函数返回&#34; 0&#34;之后,我看到我的程序已将数据输出到测试文件&#34; loginns.dat&#34;,正确。 我的程序必须在开始时读入此登录ID数据,因为当程序转换为登录时,需要数据。另外,我尝试将这些数组和for循环放在不同的位置:登录函数本身,main函数,甚至是我绝望创建的另一个函数。
我已经搜索了几个小时,如何解决这个问题无济于事,并且自己试了很多个小时。我试图解决这一问题的每一步都会导致更多死胡同或更多问题。我是初学者,因为这个学年是学习c ++的第一年,我迫切需要专家意见(或任何知识渊博的人)来帮助我面对正确的方向。
谢谢。
答案 0 :(得分:0)
您只需要在写入后刷新流:
for (int x = 0; x < 20; x++)
{
OUT << logs[x] << " " << "hue" << " ";
}
OUT.flush();
这种奇怪行为的原因是文件流在写入文件时不一定会立即写出文件。出于效率原因,他们将数据写入内部存储器缓冲区(流使用的存储区域),然后在刷新缓冲区时立即将缓冲区内容写入文件。当应用程序完成时,它的所有流缓冲区都会自动刷新,这就是为什么在程序完成后你看到文件已被写入的原因。但是,如上所示,您可以自己更早地冲洗它们。当缓冲区变满时也会发生这种情况。
您还可以使用endl
令牌触发刷新,该令牌会写入换行符并刷新缓冲区,如下所示:
for (int x = 0; x < 20; x++)
{
OUT << logs[x] << " " << "hue" << " " << endl;
}