如何在C ++中读取char中的char文件?

时间:2012-01-29 19:00:40

标签: c++

我正在尝试从文件中读取,但我唯一能做的就是使用getline()。

问题在于,阅读整行不适合我。

我的输入文件如下所示:

abc 10 20
bbb 10        30
ddd 40 20

当每行中的第一个单词应保存为字符串,并且后面的数字都作为整数编号。 每行中“单词”之间的分隔符可以是SPACE或TAB。

唯一的解决方案是通过char读取char吗?还是有另一种解决方案吗?

6 个答案:

答案 0 :(得分:5)

据说你想要这样的东西:

std::string s;
int         v0, v1;
while (in >> s >> v0 >> v1) {
    std::cout << "do something with s='" << s << "' v0=" << v0 << " v1=" << v1 << "\n";
}

但是,这并不能确保值全部在一行上。如果您想安排此操作,可能需要使用std::getline()阅读一行,然后使用std::istringstream将该行拆分为上述行。

答案 1 :(得分:1)

您可以使用getline()并让函数返回从getline()收到的字符串中的每个连续字符。

答案 2 :(得分:1)

对于它的价值,我同意@ Dietmar的回答 - 但我可能会更进一步。从事物的外观来看,每行输入代表某种逻辑记录。我可能会创建一个类来表示该记录类型,并为该类提供operator>>的重载:

class my_data { 
    std::string name;
    int val1, val2;

    friend std::istream &operator>>(std::istream &is, my_data &m) { 
        std::string temp;
        std::getline(is, temp);
        std::istringstream buffer(temp);
        buffer >> m.name >> m.val1 >> m.val2;
        return is;
    }
};

您可能需要做一些额外的逻辑,将字符串流中的失败转换传播到您读取原始数据的istream。

在任何情况下,有了这个,您可以(例如)直接从流初始化对象向量:

std::vector<my_data> whatever(
    (std::istream_iterator<my_data>(some_stream)),
    (std::istream_iterator<my_data>());

答案 3 :(得分:0)

@Dietmar使用运算符&gt;&gt;进行阅读的想法对于每个单个值都很好,但是你仍然有这个问题与结束。

但是,您不必将整行存储在临时字符串中,您可以使用std :: istream :: ignore()进行流式处理和更高效:

bool read_it(std::istream& in, std::string& s, int& a, int& b)
{
  if (in >> s >> a >> b) // read the values
    in.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); // read the newline      
  return in;
}

答案 4 :(得分:0)

要按字符读取文件,同时保留输入文本格式,可以使用以下命令:

if (in.is_open())
    char c;
    while (in.get(c)) {
        std::cout << c;
    }
}

其中in是类型std::ifstream的输入流。您可以打开这样的文件,如下所示:std::ifstream in('myFile.txt');

如果您不介意格式化,而是希望全部打印在一行中,那么您可以按照DietmarKühl的建议进行操作。

答案 5 :(得分:-1)

使用fscanf,http://www.cplusplus.com/reference/clibrary/cstdio/fscanf/

fscanf(stream, "%s %d %d", &s, &a, &b);