请你帮我完成这项任务。
我应该创建一个包含三个学生的ID和标记的txt文件,输出应该是ID和另一个txt文件中的消息。
当我尝试运行代码时,输出txt文件为空。 我尝试更改代码,以便程序在屏幕上输出结果,但由于某种原因它不会读取第一行并重复第三行!
我正在使用Visual Studio 2012。
输入数据:
20112233 90
20115566 80
20113756 70
这是我的代码:
#include <iostream>
#include <fstream>
using namespace std;
void main ()
{
int ID, mark, c=1;
ifstream fin;
fin.open ("marks.txt");
fin >> ID >> mark;
ofstream fout;
fout.open ("grades");
while (c<=3)
{
fin >> ID >> mark;
if (mark >= 90 && mark <= 100) {
fout << ID << "\t" << "Excellent" << endl;
c++;
}
else if (mark >= 80 && mark <= 89) {
fout << ID << "\t" << "Very Good" << endl;
c++;
}
else if (mark >= 70 && mark <= 79) {
fout << ID << "\t" << "Good" << endl;
c++;
}
else if (mark >= 60 && mark <= 69) {
fout << ID << "\t" << "Accepted" << endl;
c++;
}
else if (mark >= 0 && mark <= 59) {
fout << ID << "\t" << "Fail" << endl;
c++;
}
else fout << "Wrong data";
}
fin.close ();
fout.close ();
system ("PAUSE");
}
答案 0 :(得分:1)
让我们完成以下步骤:
打开 .txt 文件进行输入:
std::ifstream fin("marks.txt");
请注意我们如何使用构造函数打开.txt文件而不是使用open
。这是在构造中已知路径时打开.txt文件的首选方法。
打开 .txt 文件输出:
std::ofstream fout("grade");
创建要从输入txt文件中提取其值的变量。这将是ID和等级:
int ID, mark;
现在,从txt文件中提取值非常简单。如果要提取txt文件中每行的值,则无需设置计数器 - 当提取到EOF字符(文件结尾)时,提取将停止。
提取的惯用方法是使用循环的条件表达式执行提取,以便它可以返回流,因此可以评估有效的文件条件。这是通过IOStreams中的格式化和未格式化的I / O运算符自动完成的:
while (fin >> ID >> mark)
{
// ...
}
关闭文件:这是通过销毁流类本身自动完成的。如果您不再使用这些文件,只要让它们在超出范围或程序结束时自行关闭。含义不要调用close()
。
答案 1 :(得分:1)
首先,main
函数必须返回int
。
其次,您似乎从流中执行读取并将其丢弃。
fin >> ID >> mark; // Read tokens and clear them from the stream.
第三,您不会检查您是否以及从流中读取了什么。
while (c<=3)
{
fin >> ID >> mark; // What if this fails?
尝试这样的事情:
#include <fstream>
int main () {
std::ifstream fin("marks.txt");
std::ofstream fout("grades");
int id, mark;
while (fin >> id >> mark) { // Loop while tokens can be read successfully
if (mark >= 90 && mark <= 100) {
fout << id << "\tExcellent" << std::endl;
} else if (mark >= 80 && mark <= 89) {
fout << id << "\tVery Good" << std::endl;
} else if (mark >= 70 && mark <= 79) {
fout << id << "\tGood" << std::endl;
} /* ... */
}
}