-5

我安静是这个社区的新人,并向大家致意。我只是对我的编码有疑问

这是任务;

“问题编写一个程序来模拟管理考试成绩。规范在60-100范围内随机生成100个“考试成绩”,并将它们保存在一个文本文件中。读取文本文件并执行以下操作:计算60之间的考试成绩数量-69, 70-79, 80-89, 90-100. 确定所有测试分数的高、低和平均分。显示汇总结果(每个范围内的分数数;所有分数的高、低和平均)。保存结果在一个单独的文本文件中,格式与它们在屏幕上显示的格式相同。"

这就是我到目前为止所做的。我用 60 到 100 之间的 100 个数字完成了创建文件,并将其保存在文本文件中。但是,在读取文件时,它要么不读取它,要么给我一个空白的控制台页面。我该怎么办?还可以说如果我做了这部分,对于说“计算 60-69、70-79、80-89、90-100 之间的测试分数的数量”的部分,你将如何创建这个结构?(for 循环,if 语句)大多数视频仅显示创建 .txt 文件或读取它。我还没有遇到过同时结合创建和阅读的示例。(注:我看了一堆视频,但没有解决我的问题,你是我最后的希望)

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <cmath>
#include <string>
#include <fstream>

using namespace std;
int main ()   
{

int testnumber;
int count;

ofstream data;
data.open("data.txt"); 

int fromfile; //gets the integer from file.

ifstream readFile; // reading from file streamer;
readFile.open("data.txt"); //reads data.text




for (count = 1; count <= 100; count++)
      {
          testnumber =rand() % 40+60;
          cout << "test score " << testnumber << endl;                                  
          data << testnumber << endl;

}
        data.close();


while(!readFile.eof() ) 
        {
            getline(readFile,fromfile); 
            cout<<fromfile; // Prints our STRING.

        }
readFile.close();


system("pause");                              
}
4

4 回答 4

0

似乎open静默阅读的操作失败了。要解决此问题,请在关闭文件进行写入后打开文件进行读取:

ofstream data;
data.open("data.txt"); 

ifstream readFile; // reading from file streamer; not open yet

...

data.close();

readFile.open("data.txt"); // open the file that we have just created

如果将程序的不相关部分分开,则可以自动避免此问题。在这种情况下,最好有一个读取函数和另一个写入函数:

void write_stuff()
{
    ofstream data("data.txt"); // one line of code is sufficient to open a file

    ...

    // No need to close - file is closed automatically when exiting a function
}

void read_stuff()
{
    ifstream readFile("data.txt"); //reads data.text

    ...

    // No need to close either
}

int main()
{
    write_stuff();
    read_stuff();
}

如您所见,拥有 2 个函数的副作用是您无需考虑打开/关闭顺序;“系统”“自动”执行此操作。

于 2013-10-19T19:51:59.787 回答
0

在将数据写入文件之前,您同时打开ofstream和。ifstream打开ofstream,将数据写入其中,关闭它,然后打开ifstream并从中读取。

对于阅读部分,您所要做的就是转换fromLineint,例如使用istringstream,然后您可以根据需要对值进行操作。

于 2013-10-19T19:55:18.770 回答
0

看这里:

for (count = 1; count <= 100; count++)
{
    ...
}

data.close();                                                               /*
^^^^^^^^^^^^^                                                               */


while (!readFile.eof()) 
{
    getline(readFile, fromfile);                                          /*
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^                                          */
}

您关闭了该文件,但稍后又对其进行了写入,然后再次打开它。问题是,你不应该首先关闭它 -std::ofstream销毁时会自动关闭文件。

此外,while (!file.eof())被认为是不好的做法。建议您在while()表达式中执行 I/O 操作,然后访问有效的文件条件:

while (std::getline(readFile, fromFile))

另一件事 -fromFile是一个整数,但getline检索行。它的第二个参数是一个字符串。您应该在operator >>此处使用格式化输入运算符进行提取:

while (readFile >> fromFile)

这是您的新的和改进的程序:

#include <iostream>
#include <fstream>

// no more using namespace std please

int main()   
{
    int testnumber;
    int count;

    std::fstream data("data.txt"); // use `std::fstream` for both input
                                   // and output

    int fromfile;

    for (count = 1; count <= 100; ++count)
    {
        testnumber = rand() % 40 + 60;
        std::cout << "test score " << testnumber << std::endl;
        data << testnumber << std::endl;
    }

    while (readFile >> fromFile) 
    {
        std::cout << fromfile;
    }

    std::cin.get(); // don't use `system("pause")
}
于 2013-10-19T20:01:02.347 回答
0

一旦您更改int fromfile; //gets the integer from file.std::string fromfile;. 我不明白您的编译器如何没有抱怨它。正如其他答案所说,最好不要多次打开文件,但这在您的情况下不是问题。

于 2013-10-19T20:03:59.057 回答