文本文件有1或2或3个字符串,后跟双精度数。我如何读取字符串?(每行在开头有1或2或3个字符串)

时间:2016-08-30 03:21:09

标签: c++ string c++11

我还是c ++(以及stackoverflow)的新手。 我正在创建程序来为我分析一些数据(打开文件,将数据保存到向量中,然后我搜索向量的名称,然后我使用对象函数)。无论如何,以前"版本"该程序工作正常,但我打开的文件在开头只包含每行1个字符串(后跟其他数据),因此很容易使用。

我试图做的是打开包含1-3个字符串的文件(即第1行 - 西汉姆联队,第2行 - 埃弗顿等)。在名称之后,其他数据在同一行上。

我考虑过将名称和其他数据分成2行,例如Line1 - name,Line2 - 其他数据,依此类推。但是如何保存整个"名称"线到矢量(矢量是对象类型)。其他选项是打开文件并将所有字符保存到数组中。之后我会在Outfile中输出该数组,只删除字母之间的空格(即 - WestHamUnited),然后我将使用输出文件。

问题是,如何删除字母之间的空格? 也许你们可以推荐一些我不知道的其他选项。

3 个答案:

答案 0 :(得分:0)

"Question is, how do I delete the spaces only between letters?"

You are aware of std::string, aren't you? Then you should be able to locate a method that deletes a character or character range from the string.

Good. Than the only problem would be how to detect if a character is a space. How hard could it be, I wonder.

I short: RTFM, Luke, use it with full confidence.

答案 1 :(得分:0)

假设有<head runat="server"> <title></title> <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.3/jquery.min.js"></script> <script type="text/javascript"> $(function () { $(".bc_likes").click(function () { var id = $(this).data('id'); $.ajax({ url: 'RepeaterExample.aspx/ServerCall', contentType: "application/json; charset=utf-8", data: JSON.stringify({ id: id }), method: 'POST', success: function (data) { alert(data.d); }, error: function (err) { console.log(err); } }); }); }); </script> </head> <body> <form id="form1" runat="server"> <ul> <asp:Repeater ID="Repeater1" runat="server"> <ItemTemplate> <li> <div id="divproblem" class="bc_likes gallery_likes_add" data-id='<%# Eval("ID") %>' style="border:1px solid red;"> <i class="stand_icon icon-heart"></i> <span><%# Eval("ProductName") %></span> </div> </li> </ItemTemplate> <SeparatorTemplate> <hr /> </SeparatorTemplate> </asp:Repeater> </ul> </form> </body> 对象存储的文本行(string可以通过s从文件/流中读取)

getline

我们需要在第一个数字之前读取所有文本到其他 std::string s = "Manchester City 17 26 2.16"; (加入一些没有空格的单词)

string

我们不知道在第一个数字在字符串中之前会有多少非数字(名称的一部分),但我们希望这个数字是。

如果您的任务类似,请考虑以下示例:

 std::string name = ""; // empty string to store name

<强>更新

实际上我们可以使用 std::istringstream ss(s); // creation of stream object to read data from text line double d = 0; // will be the first number std::string str; // buffer string for parts of name bool notNumber; // loop that works to update name trying to find a number do{ ss >> d; // try to read number notNumber = ss.fail(); // save the state (if number was read value is false) if (notNumber) // is value is true (not a number is the first in the stream) { ss.clear(); // reset the state ss >> str; // read a word name.append(str); // add this word to the name } } while (notNumber && !ss.eof()); // while non-numbers are read and stream is not empty // after loop we have name and, perhaps, number std::cout << "Name is: " << name << std::endl; std::cout << "The first number is: " << d << std::endl; 知道该数字确实存在于初始字符串notNumber

s

更新2:

包含

的文件if (notNumber) std::cout << "There is no number after name!" << std::endl; else std::cout << "The first number is: " << d << std::endl;
  

西汉姆联队3.14 22

     

埃弗顿17 26 2.16

     

曼彻斯特城9.32 17 26

以下计划

test.txt

提供以下输出:

enter image description here

答案 2 :(得分:0)

如果您可以控制输入文件格式,我建议您为第一列引入一些分隔符标记。

否则,如果列数固定,则可以反向读取行。例如。最新的3个单词是数字,其余的都是团队的名字。

请注意,在第一个数字之前读取单词是错误的,因为存在名称中包含数字的团队(例如FC Schalke 04)。

以下是一个例子:

struct FileLine
{
    std::string col1;
    double col2 = 0., col3 = 0., col4 = 0.;

    // `words` is a vector of words from a line in file
    bool load(const std::vector<std::string>& words)
    {
        col1.clear();
        col2 = col3 = col4 = 0.;

        std::vector<std::string>::size_type n = words.size();
        if (n >= 4) {
            col4 = std::stod(words.at(n-1));
            col3 = std::stod(words.at(n-2));
            col2 = std::stod(words.at(n-3));
            col1 = std::accumulate(words.begin(), words.end()-3, col1);
        }

        return n >= 4;
    }
};

另一种方法是使用正则表达式(link)。它是用于文本解析的非常强大的工具。