C++ 文件 I/O 函数

Posted

技术标签:

【中文标题】C++ 文件 I/O 函数【英文标题】:C++ file I/O functions 【发布时间】:2013-10-31 23:35:03 【问题描述】:

我想从文件输入中读取行,并能够将变量分配给行的不同部分。

示例输入:

4 5.35  Wine Stoppers
2 14.85  Silver Cheese Trays

我想要一个变量,因为我需要将每一行中的双精度乘以一个常数,然后将更新的行发送到一个新文件。

我不是要代码,我只是要更多我想要研究的功能来完成这样的任务。这是我在 C++ 中工作的第一周,所以我认为这是一些基本的东西,但老师没有教我们在实验室中需要做什么。他确实让我包含,所以我觉得我需要字符串函数,但我在网上搜索一些对我有用的函数时遇到了麻烦。

到目前为止我所拥有的(越野车):

#include <iostream>
#include <fstream>
#include <string>
using namespace std;

// Accepts: N/A
// Returns: 0 if no error

int main(void)
    ifstream inputFile("order.txt");
    ofstream outputFile("inventory.txt");
    string line;
    char description;
    int quantity, retail;
    const double MARKUP = 2.4;
    while (getline(inputFile, line))
        inputFile >> quantity >> retail >> description;
        outputFile << quantity << retail * MARKUP << description <<
            endl;
    
    cout << "Inventory File created" << endl;
    inputFile.close();
    outputFile.close();

    return 0;

【问题讨论】:

看看cppreference.com。 你的输入真的有引号吗? @Prashant no,你为我正确格式化了它。我这样做是因为这样做是有道理的。 【参考方案1】:

您需要流插入运算符(即operator&gt;&gt;())或某种形式的格式化 I/O 功能。您可以使用其中任何一种,但就我们的目的而言,流插入运算符就足够了。对于您提供给插入运算符的每个参数,流将遍历其缓冲区中的每个字符并分配与参数类型相对应的值。例如:

std::ifstream in("in.txt");

int x;
in >> x;

您应该知道这是如何工作的:

首先,流提取并丢弃前导空格,直到找到流中的第一个有效字符。解析后,如果字符对于int 是正确的,则将其提取到整数中,然后流转到下一个字符。如果不是,则将流置于错误状态。

你说你的文件是这样的:

4 5.35 Wine Stoppers 2 14.85 Silver Cheese Trays

因此,您将需要两个整数、两个浮点变量和四个字符串来进行提取。您可以按照值出现的顺序执行提取:

int a, b;
float f1, f2;
std::string wine, silver, trays, stoppers;

in >> a >> f1 >> wine >> stoppers >> b >> f2 >> silver >> cheese >> trays;

如果值在文件中以行格式显示,则应使用std::getline 并循环。

【讨论】:

我更新以显示我拥有的代码。你能看出我做错了什么吗? @WorldDominator != NULL 是错误且不需要的。此外,它下面的另一个getline 是错误的。它应该只是inputFile &gt;&gt; ... 谢谢。还有一个快速的问题。如何将“描述”作为一个对象阅读?基本上我想要的第二个 int 之后的所有内容都是字符串。 @WorldDominator 那么首先description 不能是char。它应该是std::string。此外,当您提取到retail 时,停止,然后使用std::getline(inputFile, description) 将其余行插入description【参考方案2】:

查看标准库的 iostream 模块,它允许您使用文件流。特别是,您可能需要注意允许您逐行读取文件的 fstream 对象和允许您标记字符串(根据分隔符拆分它们)的 stringstream 对象。祝你好运!

【讨论】:

以上是关于C++ 文件 I/O 函数的主要内容,如果未能解决你的问题,请参考以下文章

Java 中协议缓冲区分隔的 I/O 函数是不是有 C++ 等效项?

Android C++系列:Linux文件IO操作

C++ I/O 进阶

在 I/O C++ 中花费的分析时间

C++标准库

在c语言中 stream是啥函数?