读取和比较文本文件中的行

时间:2011-11-22 05:51:18

标签: c++

我有这个代码,我想从文本文件中读取行并从该行中查找唯一代码。这是我的文本文件的一些内容:

  

AGU UAC AUU GCG CGA UGG GCC UCG AGA CCC GGG UUU AAA GUA GGU GA

     
    

GUU ACA UUG CGC GAU GGG CCU CGA GAC CCG GGU UUA AAG UAG GUG A

  
      UUA CAU UGC GCG M GGC CUC GAG ACC CGG GUU UAA AGU AGG UGA

     

UGG M AAA UUU GGG CCC AGA GCU CCG GGU AGC GCG UUA CAU UGA

我想找到包含字母'M'的行并使它们成为单独的字符串,以便我可以将它们分解得更多并进行比较。我虽然有点麻烦。 我试图找到它们并将其分配给字符串,但它似乎将所有行分配给相同的字符串。这就是我到目前为止所做的:

ifstream code_File ("example.txt");   // open text file.
if (code_File.is_open()) {
   while (code_File.good()) {
      getline(code_File,line);    //get the contents of file 
      cout  << line << endl;     // output contents of file on screen.
      found = line.find_first_of('M', 0);               // Finding start code
      if (found != string::npos) {
         code_Assign.assign(line, int(found), 100);        
         /* assign the line to code_Assign and print out string from where I 
            found the start code 'M'. */
         cout << endl << "code_Assign: " << code_Assign << endl << endl;

ED:我应该使用字符串替换而不是分配吗?

1 个答案:

答案 0 :(得分:2)

每次迭代都会重写code_Assigncode_Assign.assign(line, int(found), 100);为字符串分配来自line内容,之前的内容将丢失。使用replace也不会。您需要在某处存储字符串,最简单的方法是使用vector

你声明一个空字符串向量,如下所示:

std::vector<std::string> my_vector_of_strings;

与普通数组不同,vector在向其添加元素时会动态调整自身大小,因此您无需知道在编译时需要多大。更多信息:vector reference

接下来,

   while (code_File.good()) {
        getline(code_File,line); 

是糟糕的形式,之前已经多次解释过SO(here,例如)。 在getline()条件下移动while来电。您的代码应如下所示:

// untested

ifstream code_File ("example.txt");   // open text file.
vector<string> vec_str;               // declare an empty vector of strings
string line;

if (code_File.is_open())
    while (getline(code_File, line)) { // read a line and only enter the loop if it succeeds 
        size_t found = line.find_first_of('M');  // you can omit the second parameter, it defaults to 0 
        if (found != string::npos) {
             line = line.substr(found); // take a substring from where we found 'M' to the end 
             vec_str.push_back(line);   // add the line to the vector
        }
    }

// print out the lines in vector:

for (size_t i = 0; i < vec_str.size(); i++)
    cout << vec_str[i] << endl;

// or, prettier, using the new c++11's range based for:

for (string s& : vec_str) cout << s << endl;

希望有所帮助。