2015-12-08 79 views
0

我正在尝试使用动态编程来查找哪些项目要在一定的权重容量下从文本文件中选择,同时使值最大化。该文件的格式如下:从文件中读取C++ Ifstream

item1, weight, value 
item2, weight, value 

可变数量的项目。我在读取主要方法中的文件时遇到问题,我试图错误地检查错误的输入。我的问题来自于我检查重量是否丢失,或者是字符串而不是int。我无法弄清楚如何单独检查一个字符串,或者如果在那个地方没有任何东西。我应该输出一个不同的错误,这取决于它是哪一个。谢谢。

int main(int argc, char * const argv[]) 
{ 
    std::vector<Item> items; 
    if (argc != 3) 
    { 
     std::cerr << "Usage: ./knapsack <capacity> <filename>"; 
     return -1; 
    } 

    int capacity; 
    std::stringstream iss(argv[1]); 

    if (!(iss >> capacity) || (capacity < 0)) 
    { 
     std::cerr << "Error: Bad value '" << argv[1] << "' for capacity." << std::endl; 
     return -1; 
    } 

    std::ifstream ifs(argv[2]); 
    if (ifs.is_open()) 
    { 
     std::string description; 
     unsigned int weight; 
     unsigned int value; 
     int line = 1; 
     while (!ifs.eof()) 
     { 
      if (!(ifs >> description)) 
      { 
       std::cerr << "Error: Line number " << line << " does not contain 3 fields." << std::endl; 
       return -1; 
      } 

      if (!(ifs >> weight)) 
      { 
       if (ifs.eof()) 
        std::cerr << "Error: Line number " << line << " does not contain 3 fields." << std::endl; 
       else 
        std::cerr << "Error: Invalid weight '" << ifs << "' on line number " << line << "." << std::endl; 
       return -1; 
      } 

      else if (!(ifs >> weight) || (weight < 0)) 
      { 
       std::cerr << "Error: Invalid weight '" << ifs << "' on line number " << line << "." << std::endl; 
       return -1; 
      } 

      if (!(ifs >> value)) 
      { 
       if (ifs.eof()) 
        std::cerr << "Error: Line number " << line << " does not contain 3 fields." << std::endl; 
       else 
        std::cerr << "Error: Invalid value '" << ifs << "' on line number " << line << "." << std::endl; 
       return -1; 
      } 

      else if (!(ifs >> value) || (value < 0)) 
      { 
       std::cerr << "Error: Invalid value '" << ifs << "' on line number " << line << "." << std::endl; 
       return -1; 
      } 

      Item item = Item(line, weight, value, description); 
      items.push_back(item); 
      line++; 
     } 

     ifs.close(); 
     knapsack(capacity, items, items.size()); 
    } 

    else 
    { 
     std::cerr << "Error: Cannot open file '" << argv[2] << "'." << std::endl; 
     return -1; 
    } 

    return 0; 
} 

回答

0

我认为更好的方法将使用getline函数,通过这个函数,你将采取一整行,然后你可以尝试将它分成三个字符串。如果没有找到三个部分或三个部分中的任何一个格式不正确,则可能会输出错误。

下面的示例代码给,

#include<fstream> 
#include<iostream> 
#include<vector> 
#include <sstream> 
#include<string> 

using namespace std; 

void split(const std::string &s, std::vector<std::string> &elems, char delim) { 
    elems.clear(); 
    std::stringstream ss(s); 
    std::string item; 
    while (std::getline(ss, item, delim)) { 
    elems.push_back(item); 
    } 
} 

int main() 
{ 
    vector<string> elems; 
    ifstream fi("YOUR\\PATH"); 

    string inp; 
    while(getline(fi, inp)) 
    { 
    split(inp, elems, ' '); 

    if(elems.size() != 3) 
    { 
     cout<<"error\n"; 
     continue; 
    } 

    int value; 
    bool isint = istringstream(elems[1])>>value; 
    if(!isint) 
    { 
     cout << "error\n"; 
     continue; 
    } 

    cout<<"value was : " << value << endl; 
    } 
    return 0; 
} 
+1

您使用的'.EOF()'作为循环终止是错误的。使用'std :: getline(fi,inp);'代替。 (提升''std :: string inp;'退出循环。) – Casey

+0

谢谢@Casey。尽管如此,我仍然展示了主要想法。 – Ultraviolet

+0

谢谢你这篇文章@Md.SumsuddinShojib但是我仍然有一个问题,因为delim是“,”而不是简单的''字符。 – spicelord

0

您可以一次读取整行,并使用正则表达式检查其格式。