当看到文件中的字符串时,c ++ fstream

时间:2018-07-09 19:08:07

标签: c++ fstream

我编写了一个代码,但是它不起作用。能帮上忙吗?在代码中,我想占一行,如果代码看到 // n ,则结束。

这是我的例子。
文件:

I love C++! //n

我的代码:

ifstream file("file.txt");
char text[250];
while(file >> text){
  cout << text << " ";
  if(text == "//n"){
    cout << endl;
  } 
}

感谢您的帮助。

3 个答案:

答案 0 :(得分:1)

我不确定您要做什么,但是似乎您想获取一行文本。如果是这样,您想更改

char  text[255];

....

if(text == "//n") 

std::string  text;

...

if(text == "\n")

数组比较将不比较字符串。因此,请使用std :: string来使用==运算符。

由于C ++特殊字符代码使用反斜杠而不是两个正斜杠。

但是,我也建议使用单个字符而不是数组(因为似乎只需要访问其中的第一个字符,因此索引似乎并不重要)。

答案 1 :(得分:1)

如果您想一次读一个文件:

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";
}

基本上,您的代码有两个问题。

  1. '// n'不是一个特殊字符,我们都认为您的意思是'\ n'。
  2. 大多数从文件中读取文本的运算符都会讨厌'\ n'字符。
    operator>>将保护空格(包括\ n)。
    getline()读取行但删除\ n。
    因此,'\n'也永远不会在文本中进行比较。
  3. 数组char text[255]可以轻松地将自身转换为指针。
    因此,您正在执行的比较将比较两个指针。这将永远不会相等。
    您需要一种能对==进行巧妙处理的类型,以便您比较文本。
    为此,您应该使用std::string

作为良好的样式指南。

切勿在代码中加入using namespace std;。当您只有一点简单的一次性代码时,它将引起更多的麻烦。在简单的一次性代码中使用它是一个坏习惯,有一天会赶上您。

std(以及其他)简短而不是standard的原因是,从标准库中为项目添加前缀并不麻烦。

std::cout << text << " "; // not hard.
std::cout << std::endl;

没有真正的理由使用std::endl(我认为调试是个例外)。在正常情况下,它添加的额外冲洗通常会导致输出明显降低。因此,除非您特别想强制进行冲洗,否则最好使用'\n'

答案 2 :(得分:0)

这里的问题是,您的代码比较指针,而不是比较字符串(在其他答案中也提到):

if(text == "//n")
{
    ...
}

这里text是一个指针(实际上是char的数组,但是在这种情况下,它等效于一个指针),而"//n"也是一个指针(也是一个数组) 。比较两个指针不是您想要的。

要修复代码以便比较字符串,代码要比较的一件事应该是字符串而不是指针。要将"//n"标记为字符串,请在其后附加s

if(text == "//n"s)
{
    ...
}

这有点晦涩;另一个解决方案是使text为字符串(如另一个答案中所述):

std::string text;