与以不同格式的数字字符阅读相关的问题

时间:2015-09-23 22:14:57

标签: c++ io

我如何读取这些元素并将它们存储到两个不同的数组中,即:<?>中的数字和[?]中的单词将被单独读入和存储。

<98>
Avs [adadada]
<45>
[adafaf] BBBHADA
asdadqd aada [Mammoth]
<-1> // ends the read

文件中的其余信息无用,无需存储。

编辑:

根据其中一个答案的建议,这是我的第一次尝试:

#include <iostream>
#include <sstream>
#include <fstream>
#include <string.h>


using namespace std;

int main(int argc, char* argv[])
{
    if(argc != 3)
        cout<< "Error! Not enough file!"<<endl;
    int** page = new int*[];
    char** words = new char*[];

}
//--------------------------------------------------------- 
void readInput(int** page1, char** name1){
    istream is;
    char par1, par2;
    int  usefulVal;
    is >> par1 >> usefulVal >> par2;

    // check if any input
    if(!is) return is;

    // check for valid input format
    if (par1 != '<' || par2 != '>'){
    // set failbit to indicate invalid input format
       is.clear(ios_base::failbit);

    // assign input values to second argument
    page1(usefulVal);

    char par_1, par_2;
    string string_value;
    is >> par1 >> string_value >> par2;
    if(!is) return is;
    if (par_1 != '[' || par_2 != ']')
    {
       is.clear(ios_base::failbit);
       return is;
    }
    name1(string_value);
    return is;
}

问题:

<击> 1。有没有办法分别阅读和存储上述元素?
2.我做错了什么?

P.S。:我只是尝试一些C ++。希望有人能够对此有所了解,谢谢!

1 个答案:

答案 0 :(得分:0)

要指定您的格式并只读取特定元素,您可能会重载operator >>。例如,第一种格式:< int_value >,可以用以下方式实现:

istream& operator>>(istream& is, class_name& array_name){
   char par2, par2;
   int  int_value;
   is >> par1 >> int_value >> par2;
   // check if any input
   if(!is) return is;
   // check for valid input format
   if (par1 != '<' || par2 != '>'){
       // set failbit to indicate invalid input format
       is.clear(ios_base::failbit);
       return is;
   }
   // assign input values to second argument
   array_name(int_value);
   // chain for consecutive use
   return is;
} 

和第二种格式:[ string_value ]

istream& operator>>(istream& is, class_name& separate_array_name){
   char par2, par2;
   string string_value;
   is >> par1 >> int_value >> par2;
   if(!is) return is;
   if (par1 != '[' || par2 != ']'){
       is.clear(ios_base::failbit);
       return is;
   }
   separate_array_name(string_value);
   return is;
} 

注意:

两个示例中的第二个参数:class_name& array_nameclass_name& separate_array_name都不是真正的类型,只供您决定/实施。

编辑:

  1. 您定义的功能未在main()
  2. 中使用
  3. 该函数需要在main()或前向声明之前定义。
  4. 限制过度使用指针和动态分配的内存,因为它需要在最后处理(释放)。
  5. 查找如何使用istream:文件名,模式等。
  6. 首选简单功能,即执行一个单一过程。实现和检测错误要容易得多。