在文件中看到字符串时的c ++ fstream
c++ fstream when see string in file
我做了一个代码,但它没有work.Can你帮忙吗?在代码中,我想取一行,如果代码看到 //n,结束行。
这是我的例子。
文件:
I love C++! //n
我的代码:
ifstream file("file.txt");
char text[250];
while(file >> text){
cout << text << " ";
if(text == "//n"){
cout << endl;
}
}
感谢您的帮助。
我不确定您要做什么,但您似乎想要获得一行文本。如果是这样,你会想改变
char text[255];
....
if(text == "//n")
到
std::string text;
...
if(text == "\n")
数组比较不会比较字符串。所以使用 std::string 允许您使用 ==
运算符。
因为 C++ 特殊字符代码使用反斜杠而不是两个正斜杠。
但是,我还建议使用单个字符而不是数组(因为索引似乎不是问题,因为您只访问其中的第一个字符)。
如果您想一次读取一个文件:
ifstream file("file.txt");
std::string line;
while(std::getline(file, line)) {
std::stringstream linestream(line);
std::string word;
while(linestream >> word) {
std::cout << "Word: " << word << " ";
}
std::cout << "EOL\n";
}
基本上你的代码有几个问题。
- '//n' 不是特殊字符,我们都假设您指的是 '\n'。
- 大多数从文件中读取文本的运算符都会忽略“\n”字符。
operator>>
会屏蔽白色 space (包括 \n).
getline()
读取该行但删除 \n。
因此 '\n'
永远不会出现在要比较的文本中。
- 数组
char text[255]
很容易将自己转换为指针。
因此,您正在进行的比较是比较两个指针。这永远不会相等。
您需要一种可以使用 ==
做一些聪明的事情的类型,以便您比较文本。
为此你应该使用 std::string
.
作为一个很好的风格指南。
永远不要在代码中加入 using namespace std;
。当您只有一点简单的一次性代码时,它会造成更多麻烦。在简单的一次性代码中使用它是一个坏习惯,总有一天你会养成的。
std
(以及其他)很短而不是 standard
的原因是,从标准库中为它添加前缀并不麻烦。
std::cout << text << " "; // not hard.
std::cout << std::endl;
没有真正的理由使用std::endl
(我想调试是个例外)。在正常情况下,它添加的额外冲洗通常会导致输出明显减慢。所以更喜欢使用 '\n'
除非你特别想强制刷新。
这里的问题是,您的代码比较指针,而不是比较字符串(如其他答案中所述):
if(text == "//n")
{
...
}
这里的text
是一个指针(其实就是char
的数组,但是在这个上下文中相当于一个指针),"//n"
也是一个指针(也是一个大批)。比较两个指针不是你想要的。
要修复您的代码以便比较字符串,您的代码比较的对象之一应该是字符串而不是指针。要将 "//n"
标记为字符串,请将 s
附加到它:
if(text == "//n"s)
{
...
}
这有点晦涩;另一种解决方案是使 text
成为一个字符串(如其他答案中所述):
std::string text;
我做了一个代码,但它没有work.Can你帮忙吗?在代码中,我想取一行,如果代码看到 //n,结束行。
这是我的例子。
文件:
I love C++! //n
我的代码:
ifstream file("file.txt");
char text[250];
while(file >> text){
cout << text << " ";
if(text == "//n"){
cout << endl;
}
}
感谢您的帮助。
我不确定您要做什么,但您似乎想要获得一行文本。如果是这样,你会想改变
char text[255];
....
if(text == "//n")
到
std::string text;
...
if(text == "\n")
数组比较不会比较字符串。所以使用 std::string 允许您使用 ==
运算符。
因为 C++ 特殊字符代码使用反斜杠而不是两个正斜杠。
但是,我还建议使用单个字符而不是数组(因为索引似乎不是问题,因为您只访问其中的第一个字符)。
如果您想一次读取一个文件:
ifstream file("file.txt");
std::string line;
while(std::getline(file, line)) {
std::stringstream linestream(line);
std::string word;
while(linestream >> word) {
std::cout << "Word: " << word << " ";
}
std::cout << "EOL\n";
}
基本上你的代码有几个问题。
- '//n' 不是特殊字符,我们都假设您指的是 '\n'。
- 大多数从文件中读取文本的运算符都会忽略“\n”字符。
operator>>
会屏蔽白色 space (包括 \n).
getline()
读取该行但删除 \n。
因此'\n'
永远不会出现在要比较的文本中。 - 数组
char text[255]
很容易将自己转换为指针。
因此,您正在进行的比较是比较两个指针。这永远不会相等。
您需要一种可以使用==
做一些聪明的事情的类型,以便您比较文本。
为此你应该使用std::string
.
作为一个很好的风格指南。
永远不要在代码中加入 using namespace std;
。当您只有一点简单的一次性代码时,它会造成更多麻烦。在简单的一次性代码中使用它是一个坏习惯,总有一天你会养成的。
std
(以及其他)很短而不是 standard
的原因是,从标准库中为它添加前缀并不麻烦。
std::cout << text << " "; // not hard.
std::cout << std::endl;
没有真正的理由使用std::endl
(我想调试是个例外)。在正常情况下,它添加的额外冲洗通常会导致输出明显减慢。所以更喜欢使用 '\n'
除非你特别想强制刷新。
这里的问题是,您的代码比较指针,而不是比较字符串(如其他答案中所述):
if(text == "//n")
{
...
}
这里的text
是一个指针(其实就是char
的数组,但是在这个上下文中相当于一个指针),"//n"
也是一个指针(也是一个大批)。比较两个指针不是你想要的。
要修复您的代码以便比较字符串,您的代码比较的对象之一应该是字符串而不是指针。要将 "//n"
标记为字符串,请将 s
附加到它:
if(text == "//n"s)
{
...
}
这有点晦涩;另一种解决方案是使 text
成为一个字符串(如其他答案中所述):
std::string text;