在C ++中只读取文件中的特殊单词

时间:2017-11-18 21:23:28

标签: c++ file

如果a.txt说

abc def ghi

1。我只能阅读ghi吗? 2.我可以在ghi旁输入jkl来制作a.txt

abc def ghi jkl

我尝试了第一个问题:

#include <iostream>
using namespace std;
int main() {
    int i; 
    char str[3];
    ifstream read("a.txt");
    for(i = 0; i < 3; i++)
        read >> str;
    return 0;
}

我尝试了第二个问题:

#include <iostream>
using namespace std;

int main() {
    ofstream write("a.txt");
    write << "jkl" << endl;

    return 0;
}

在我尝试第一个问题时,它只读了abc。 在我尝试第二个问题时,它写了jkl,但结果是

abc def ghi
jkl

我的代码有什么问题?

2 个答案:

答案 0 :(得分:0)

您期望每个字的长度为3个字节("abc"),但最后包含空字符,因此确实需要4个字节来存储"abc"。您应该声明char str[4];更好,使用std::string str;这样您就不必担心单词是否太长。然后将运算符>>放入while循环中,如下所示:

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

int main() 
{
    std::string str;
    std::ifstream read("a.txt");
    while(read >> str)
    {
        if(str == "ghi")
        {
            std::cout << "found it: " << word << "\n";
            break;
        }
    }
    return 0;
}

还有代码

std::ofstream write("a.txt"); 
write << "text"; 

将覆盖文件"a.txt",除非您使用std::ios::app标志,否则它不会附加到结尾。

请参阅 Input/Output tutorial 了解标记

答案 1 :(得分:0)

开始阅读更多

如果你来Stack Overflow,你必须有一个难以研究的问题,甚至是一个前所未有的新问题。

一个好的开始

搜索输入/输出流教程,this tutorial非常好,请仔细阅读,我保证当你完成后,你几乎会澄清所有问题。

审核您的代码

代码1:

#include <iostream>
using namespace std;
int main() {
    int i; 
    char str[3];
    ifstream read("a.txt");
    for(i = 0; i < 3; i++)
        read >> str;
    return 0;
}
  • 要使用输入/输出文件流,您需要包含标题fstream
  • 您可以在int循环的第一个参数中声明for
  • 您正在使用char[](字符数组),在现代C ++代码中有点弃用,您应该使用string代替。 为什么?因为string具有动态大小,char[]具有静态大小,想象您想要检索更大的字符串,表示它的长度为10,您的{{ 1}}变量将无法存储该字符串,如果您使用str,则可以接受任何大小的字符串。
  • 验证string是否已成功开启read。很明显,如果"a.txt"不存在或者其他进程正在使用它,则无法从"a.txt"读取。
  • 使用while代替for来迭代文件。您希望阅读,直到您获得字符串"ghi"或直到您阅读该文件的所有内容。

修改版本:

#include <iostream>
#include <fstream>

using namespace std;

int main() {
  string   str;
  ifstream read("a.txt");

  if (!read) {
    cout << "Cannot open the file!" << endl;
    return 1;
  }

  while (read) {
    read >> str;
    if (str == "ghi") {
      cout << "Found!" << endl;
      return 0;   // Instantly terminates the program if we found "ghi"
    }
  }

  // If our program reach this point mean that we didn't found 
  // "ghi", so we print that we didn't found it
  cout << "Not found!" << endl;
  return 0;
}

代码2:

#include <iostream>
using namespace std;

int main() {
    ofstream write("a.txt");
    write << "jkl" << endl;

    return 0;
}
  • 您忘了再次加入fstream
  • 在这种情况下,您只能在尝试打开文件时验证是否发生了错误,因为默认情况下C ++会为ofstream创建一个文件,如果它不存在的话。 (在教程链接和谷歌搜索中进一步阅读)
  • 如果您只是在文件中写入,则会覆盖您的内容
    jkl def ghi
  • 您应该使用ios::flags将内容附加到您的文件中,这会将您的内容添加到文件的末尾,这也意味着如果您的文件有换行符,则所有内容都将添加到其后,你会得到这样的东西
    abc def ghi
    jkl
  • 解决方法是使用内部流位置,因为您应该阅读我建议您使用的链接。