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;
}
我有这个代码:
#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;
}