【问题标题】:is it possible to read from a specific character in a line from a file in c++?是否可以从 C++ 文件中的一行中读取特定字符?
【发布时间】:2012-11-03 13:29:46
【问题描述】:

大家好,所以我必须从文本文件中获取值,但这些值并不是独立的,它们都是这样写的:

人口规模:30

在 C++ 中有什么方法可以在 ':' 之后读取吗? 我尝试过使用 >> 运算符,例如:

string pop;
inFile >> pop;

但当然,空格会在语句到达数字之前终止语句,并且出于某种原因使用

inFile.getline(pop, 20);

给了我很多错误,因为出于某种原因它不想直接写入字符串.. 我真的不想使用 char 数组,因为这样就不会那么容易测试数字并从字符串中单独提取它。 那么无论如何我可以将getline函数与字符串一起使用吗? 是否可以从 ':' 字符之后读取?

#include <iostream>
#include <fstream>
#include <string>
#include <cstring>
#include <cstdlib>

using namespace std;
int main()
{
    string fname;
    cin >> fname;
    ifstream inFile;
    inFile.open(fname.c_str()); 
    string pop1;
    getline(inFile,pop1);
    cout << pop1;
    return 0;
}

好的,这是我使用新 getline 的代码,但它仍然没有输出任何内容。它确实正确打开了文本文件,并且可以使用 char 数组

【问题讨论】:

  • std::stringgetline 版本不是输入流的成员:std::getline(inFile, pop)
  • 感谢您的帮助,此语句不会导致任何错误,但是当我使用 cout 时它不会输出任何内容
  • 失败的唯一原因是如果 1) 您输入了错误的文件名(因此文件无法正确打开) 2) 文件是空的 3) 文件中的第一行是空白的。添加错误检查以确保文件打开。然后打印文件中的每一行:while(std::getline(inFile, pop1)) { std::cout &lt;&lt; "Line: " &lt;&lt; pop1 &lt;&lt; "\n";}

标签: c++ string fstream


【解决方案1】:

您可能最好阅读整行然后操作字符串:-

std::string line;
std::getline(inFile, line);
line = line.substr(19);  // Get character 20 onwards...

你可能也更好地寻找冒号:-

size_t pos = line.find(":");
if (pos != string::npos)
{
    line = line.substr(pos + 1);
}

或类似的东西

完成此操作后,您可能希望将其反馈到字符串流中,以便读取整数和其他内容?

int population;
std::istringstream ss(line);
ss >> population;

显然,这一切都取决于您想对数据做什么

【讨论】:

  • 谢谢,我就是这么想的。所以对于一个字符串,你使用 getline(inFile, line) 而不是 inFile.getline(pop, 20);?酷
  • 好的,所以当我使用此代码时没有错误,但如果我 cout
  • 没有。流操作符的重点是避免这样的字符串操作。是的,一口气读完这一行,但使用字符串流来解析数据
【解决方案2】:

假设您的数据在表单中

 <Key>:<Value>

每行一个。然后我会这样做:

std::string line;
while(std::getline(inFile, line))
{
    std::stringstream  linestream(line);

    std::string key;
    int         value;

    if (std::getline(linestream, key, ':') >> value)
    {
        // Got a key/value pair
    }
}

【讨论】:

  • 冒号和值之间看起来是空格,但我认为没关系。
  • @SteveJessop:Streams 将正确处理冒号后的额外空格。所以没问题。
  • 感谢“关键”部分无关紧要,我只需要数字,因为它们进入了 GA。真正让我丧命的是这个 getline(inFile, line) 没有在我的字符串中存储任何内容
  • @user1763722:这可能是因为您的输入中有一个空行。这通常是由混合调用 std::getline() 和 operator&gt;&gt; 引起的。但要真正回答这个问题,你需要正确地提出这个问题。提供您正在使用的代码(它必须是可编译的)和输入。然后我们可以告诉你它失败的确切原因。
  • @user1763722:您使用的 getline 版本似乎也有些混乱。您的问题表明 stream.getline() 但您的 cmets 似乎表明 std::getline() 这是两个完全不同的功能。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-04
  • 1970-01-01
  • 1970-01-01
  • 2016-03-22
  • 2018-06-29
相关资源
最近更新 更多