将字符串从文件中读入 1 个字符串,而不是整数 c++

Posted

技术标签:

【中文标题】将字符串从文件中读入 1 个字符串,而不是整数 c++【英文标题】:Read strings into 1 string from file while not Integer c++ 【发布时间】:2021-04-04 13:58:11 【问题描述】:

我有一个这样的文件:

 Dr Joe Hugh 180
 Grand Johnson 180

我想把名字读成一个字符串,但我不知道名字有多长:

string str;

像这样:

str = "Dr Joe Hugh"
or
str = "Grand Johnson"

并将号码放入:

int number;

如果不是整数,我应该如何指示程序读取它们?

我想过getline,但我不知道该怎么做

【问题讨论】:

什么时候是str = "string1 string2 string3",什么时候是str = "string1 string2" 数字是否总是输入字符串的最后一个空格分隔部分? @leech 就像名字一样,当我不知道名字有多长时,我想将整个名字读入 1 str 中 【参考方案1】:

如果行总是以整数结尾,您可以使用带有某些条件的while 循环创建一个更简单的解决方案。

#include <iostream>
#include <fstream>
#include <string>
#include <vector>

bool isNumber(std::string str)

    for (int i = 0; i < str.length(); i++)
    
        if (!isdigit(str[i]) && str[i] != '-') return false;
    
    return true;


int main() 
   std::vector <std::string> names;
   std::vector <int> numbers;
   std::string str;
   int a;
   std::fstream file;
   file.open("PATH", std::ios::in);
   if (!file) return -1;
   while (file >> str)
   
       if (isNumber(str))
       
           a = stoi(str);
           numbers.push_back(a);
       
       else names.push_back(str);
   

现在你已经准备好了两个包含数字和名称的向量。如果您希望names 成为行,而不仅仅是单词,请使用vector&lt;vector&lt;string&gt;&gt; 而不是vector&lt;string&gt;,并稍微更改循环以使其工作:)

【讨论】:

【参考方案2】:

如果数字总是在行尾并且总是以空格开头,你可以这样做:

struct Line 
    std::string str;
    int number;
;

std::istream &operator>>(std::istream &in, Line &l) 
    if (std::getline(in, l.str)) 
        const char *last_space = l.str.c_str();

        for (const char &c : l.str)
            if (c == ' ')
                last_space = &c;

        l.number = std::atoi(last_space);
        l.str = l.str.substr(0, last_space - l.str.c_str());
    

    return in;

编辑 2:示例用法:

int main() 
    std::ifstream f("/path/to/file.txt");

    std::vector<Line> lines;

    // reads every line from the file into the vector
    for (Line l; f >> l; lines.push_back(std::move(l))) 

    // do stuff with your vector of lines

编辑:以牺牲可读性为代价,对上述代码的优化(如果字符串很长)将替换寻找最后一个空格的for循环,用一个反向循环字符串的循环。

for (auto it = l.str.crbegin(); it != l.str.crend(); ++it) 
    if (*it == ' ') 
        last_space = &*it;
        break;
    

【讨论】:

以上是关于将字符串从文件中读入 1 个字符串,而不是整数 c++的主要内容,如果未能解决你的问题,请参考以下文章

将文件内容读入字符串,而不是字符串数组[重复]

将文件中的间隔整数读入 C++ 中的数组

将二进制文件读入结构

如何在MATLAB中读入多个音频文件啊?

用java编写实现从键盘输入一个字符串,判断其是不是为浮点数?

关于c++文件流读入和写入的问题