c++ 我无法从txt文件中读取整数

pvabu6sv  于 2023-04-13  发布在  其他
关注(0)|答案(2)|浏览(175)

我必须使用fstream创建一个.txt文件,并在其中写入0到10,然后再次使用fstream读取该文件并将所有整数相加,然后将总和输出到控制台。
我不知道我在哪里犯了一个错误:

fstream myFile;
myFile.open("numbers.txt", ios::in | ios::out);

int sum = 0;
int number = 0;
string line;

if (myFile.is_open()) {
    for (int i = 0; i <= 10; i++) {
        myFile << i;
    }
    myFile.seekp(0, ios::beg);
    while (getline(myFile, line)) {
        myFile >> number;
        sum += stoi(line);
    }
}

cout << "Sum: " << sum << endl;
return 0;

我尝试了getline()和其他方法,但都不起作用。

bxjv4tth

bxjv4tth1#

您将数字写入文件时,它们之间没有任何分隔符,因此文件中将包含一个长数字序列,即012345678910。无论您如何阅读,您都无法理解它。因此,将数字分开以使其更容易阅读。
更重要的是,在写入文件并寻求(output 位置)到开头(而不是寻找 input 位置),然后调用getline()将 * 整个文件 * 读取到std::string中,然后尝试将整个string转换为int,但是012345678910的值超过了int可以容纳的最大值(2147483647),所以stoi()将失败。
你可以试试这个:

fstream myFile;
myFile.open("numbers.txt", ios::in | ios::out);

int sum = 0;

if (myFile.is_open()) {

    for (int i = 0; i <= 10; i++) {
        myFile << i << ' ';
    }

    myFile.seekg(0, ios::beg);

    int number;
    while (myFile >> number) {
        sum += number;
    }
}

cout << "Sum: " << sum << endl;

Online Demo
但是,请注意,当您打开文件时,您同时指定了inout标志。(即使它是空的)。所以,如果你需要创建一个新的文件,in标志一定不能指定,但这样你就不能从文件中读取,请参阅std::basic_filebuf::open()this documentation以了解原因。
因此,您必须打开文件进行写入,然后关闭并重新打开它进行阅读,例如:

fstream myFile;

myFile.open("numbers.txt", ios::out);
if (myFile.is_open()) {
    for (int i = 0; i <= 10; i++) {
        myFile << i << ' ';
    }
    myFile.close();
}

int sum = 0;

myFile.open("numbers.txt", ios::in);
if (myFile.is_open()) {
    int number;
    while (myFile >> number) {
        sum += number;
    }
    myFile.close();
}

cout << "Sum: " << sum << endl;

Online Demo
在这种情况下,您应该分别使用ifstreamofstream,而不是使用fstream,例如:

ofstream outFile("numbers.txt");
if (outFile.is_open()) {
    for (int i = 0; i <= 10; i++) {
        outFile << i << ' ';
    }
    outFile.close();
}

int sum = 0;

ifstream inFile("numbers.txt");
if (inFile.is_open()) {
    int number;
    while (inFile >> number) {
        sum += number;
    }
    inFile.close();
}

cout << "Sum: " << sum << endl;

Online Demo

wvyml7n5

wvyml7n52#

有两个错误。
1.当您在阅读和写入同一文件之间切换时,必须在两者之间插入一个查找操作。
1.同时使用getline(myFile, line)myFile >> number;是没有意义的,必须去掉其中一个。
Demo
PS:问题已更改,此答案可能对当前状态有效,也可能无效。

相关问题