c++读取文件省略换行符

Omit the newline character in reading file with c++

我有这个代码:

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

int main()
{
    std::ifstream path("test");
    std::string separator(" ");
    std::string line;
    while (getline(path, line, *separator.c_str())) {
        if (!line.empty() && *line.c_str() != '\n') {
            std::cout << line << std::endl;
        }

        line.clear();
    }

    return 0;
}

文件 "test" 由数字填充,由不同数量的空格分隔。我只需要一个一个地读取数字,并省略空格和换行符。此代码省略了空格但没有换行符。

这些是输入文件中的几行 "test":

     3        19        68        29        29        54        83        53
    14        53       134       124        66        61       133        49
    96       188       243       133        46       -81      -156       -85

我认为问题在于 *line.c_str() != '\n' 不是确定字符串 line 是否命中换行符并且程序不断打印换行符的正确方法!

这个效果很好:

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

int main()
{
    std::ifstream path("test");
    std::string separator(" ");
    std::string line;
    while (getline(path, line, *separator.c_str())) {
        std::string number;
        path >> number;
        std::cout << number << std::endl;
    }

    return 0;
}

使用 C++ 内置的 isdigit 函数。

使用流运算符>>读取整数:

std::ifstream path("test");
int number;
while(path >> number)
    std::cout << number << ", ";
std::cout << "END\n";
return 0;

这将列出文件中的所有整数,假设它们用 space 分隔。

getline 的正确用法是 getline(path, line)getline(path, line, ' '),其中最后一个参数可以是任何字符。

*separator.c_str() 在这种情况下转换为 ' '。不推荐这种用法。

同样*line.c_str()指向line中的第一个字符。要查找最后一个字符,请使用

if (line.size())
    cout << line[size()-1] << "\n";

当使用 getline(path, line) 时,line 将不包括最后一个 \n 字符。

这是 getline 的另一个例子。我们逐行读取文件,然后将每一行转换为stringstream,然后从每一行中读取整数:

#include <iostream>
#include <string>
#include <fstream>
#include <sstream>

int main()
{
    std::ifstream path("test");
    std::string line;
    while(getline(path, line))
    {
        std::stringstream ss(line);
        int number;
        while(ss >> number)
            std::cout << number << ", ";
        std::cout << "End of line\n";
    }
    std::cout << "\n";
    return 0;
}