Index: lemon/lgf_reader.h
===================================================================
--- lemon/lgf_reader.h	(revision 236)
+++ lemon/lgf_reader.h	(revision 290)
@@ -49,9 +49,11 @@
         std::istringstream is(str);
         Value value;
-        is >> value;
+        if (!(is >> value)) {
+          throw FormatError("Cannot read token");
+        }
 
         char c;
         if (is >> std::ws >> c) {
-          throw DataFormatError("Remaining characters in token");
+          throw FormatError("Remaining characters in token");
         }
         return value;
@@ -167,5 +169,5 @@
           std::ostringstream msg;
           msg << "Item not found: " << str;
-          throw DataFormatError(msg.str().c_str());
+          throw FormatError(msg.str());
         }
         return it->second;
@@ -185,10 +187,10 @@
       typename Graph::Arc operator()(const std::string& str) {
         if (str.empty() || (str[0] != '+' && str[0] != '-')) {
-          throw DataFormatError("Item must start with '+' or '-'");
+          throw FormatError("Item must start with '+' or '-'");
         }
         typename std::map<std::string, typename Graph::Edge>
           ::const_iterator it = _map.find(str.substr(1));
         if (it == _map.end()) {
-          throw DataFormatError("Item not found");
+          throw FormatError("Item not found");
         }
         return _graph.direct(it->second, str[0] == '+');
@@ -236,5 +238,5 @@
       char c;
       if (!is.get(c))
-        throw DataFormatError("Escape format error");
+        throw FormatError("Escape format error");
 
       switch (c) {
@@ -265,5 +267,5 @@
           int code;
           if (!is.get(c) || !isHex(c))
-            throw DataFormatError("Escape format error");
+            throw FormatError("Escape format error");
           else if (code = valueHex(c), !is.get(c) || !isHex(c)) is.putback(c);
           else code = code * 16 + valueHex(c);
@@ -274,5 +276,5 @@
           int code;
           if (!isOct(c))
-            throw DataFormatError("Escape format error");
+            throw FormatError("Escape format error");
           else if (code = valueOct(c), !is.get(c) || !isOct(c))
             is.putback(c);
@@ -301,5 +303,5 @@
         }
         if (!is)
-          throw DataFormatError("Quoted format error");
+          throw FormatError("Quoted format error");
       } else {
         is.putback(c);
@@ -461,4 +463,5 @@
     std::istream* _is;
     bool local_is;
+    std::string _filename;
 
     Digraph& _digraph;
@@ -510,7 +513,10 @@
     /// file.
     DigraphReader(const std::string& fn, Digraph& digraph)
-      : _is(new std::ifstream(fn.c_str())), local_is(true), _digraph(digraph),
+      : _is(new std::ifstream(fn.c_str())), local_is(true),
+        _filename(fn), _digraph(digraph),
         _use_nodes(false), _use_arcs(false),
-        _skip_nodes(false), _skip_arcs(false) {}
+        _skip_nodes(false), _skip_arcs(false) {
+      if (!(*_is)) throw IoError(fn, "Cannot open file");
+    }
 
     /// \brief Constructor
@@ -519,7 +525,10 @@
     /// file.
     DigraphReader(const char* fn, Digraph& digraph)
-      : _is(new std::ifstream(fn)), local_is(true), _digraph(digraph),
+      : _is(new std::ifstream(fn)), local_is(true),
+        _filename(fn), _digraph(digraph),
         _use_nodes(false), _use_arcs(false),
-        _skip_nodes(false), _skip_arcs(false) {}
+        _skip_nodes(false), _skip_arcs(false) {
+      if (!(*_is)) throw IoError(fn, "Cannot open file");
+    }
 
     /// \brief Destructor
@@ -846,5 +855,5 @@
         if (readSuccess() && line) line.putback(c);
         if (!_node_maps.empty())
-          throw DataFormatError("Cannot find map names");
+          throw FormatError("Cannot find map names");
         return;
       }
@@ -860,5 +869,5 @@
             std::ostringstream msg;
             msg << "Multiple occurence of node map: " << map;
-            throw DataFormatError(msg.str().c_str());
+            throw FormatError(msg.str());
           }
           maps.insert(std::make_pair(map, index));
@@ -872,5 +881,5 @@
             std::ostringstream msg;
             msg << "Map not found in file: " << _node_maps[i].first;
-            throw DataFormatError(msg.str().c_str());
+            throw FormatError(msg.str());
           }
           map_index[i] = jt->second;
@@ -896,9 +905,9 @@
             std::ostringstream msg;
             msg << "Column not found (" << i + 1 << ")";
-            throw DataFormatError(msg.str().c_str());
+            throw FormatError(msg.str());
           }
         }
         if (line >> std::ws >> c)
-          throw DataFormatError("Extra character on the end of line");
+          throw FormatError("Extra character on the end of line");
 
         Node n;
@@ -909,5 +918,5 @@
         } else {
           if (label_index == -1)
-            throw DataFormatError("Label map not found in file");
+            throw FormatError("Label map not found in file");
           typename std::map<std::string, Node>::iterator it =
             _node_index.find(tokens[label_index]);
@@ -915,5 +924,5 @@
             std::ostringstream msg;
             msg << "Node with label not found: " << tokens[label_index];
-            throw DataFormatError(msg.str().c_str());
+            throw FormatError(msg.str());
           }
           n = it->second;
@@ -939,5 +948,5 @@
         if (readSuccess() && line) line.putback(c);
         if (!_arc_maps.empty())
-          throw DataFormatError("Cannot find map names");
+          throw FormatError("Cannot find map names");
         return;
       }
@@ -953,5 +962,5 @@
             std::ostringstream msg;
             msg << "Multiple occurence of arc map: " << map;
-            throw DataFormatError(msg.str().c_str());
+            throw FormatError(msg.str());
           }
           maps.insert(std::make_pair(map, index));
@@ -965,5 +974,5 @@
             std::ostringstream msg;
             msg << "Map not found in file: " << _arc_maps[i].first;
-            throw DataFormatError(msg.str().c_str());
+            throw FormatError(msg.str());
           }
           map_index[i] = jt->second;
@@ -988,8 +997,8 @@
 
         if (!_reader_bits::readToken(line, source_token))
-          throw DataFormatError("Source not found");
+          throw FormatError("Source not found");
 
         if (!_reader_bits::readToken(line, target_token))
-          throw DataFormatError("Target not found");
+          throw FormatError("Target not found");
 
         std::vector<std::string> tokens(map_num);
@@ -998,9 +1007,9 @@
             std::ostringstream msg;
             msg << "Column not found (" << i + 1 << ")";
-            throw DataFormatError(msg.str().c_str());
+            throw FormatError(msg.str());
           }
         }
         if (line >> std::ws >> c)
-          throw DataFormatError("Extra character on the end of line");
+          throw FormatError("Extra character on the end of line");
 
         Arc a;
@@ -1013,5 +1022,5 @@
             std::ostringstream msg;
             msg << "Item not found: " << source_token;
-            throw DataFormatError(msg.str().c_str());
+            throw FormatError(msg.str());
           }
           Node source = it->second;
@@ -1021,5 +1030,5 @@
             std::ostringstream msg;
             msg << "Item not found: " << target_token;
-            throw DataFormatError(msg.str().c_str());
+            throw FormatError(msg.str());
           }
           Node target = it->second;
@@ -1030,5 +1039,5 @@
         } else {
           if (label_index == -1)
-            throw DataFormatError("Label map not found in file");
+            throw FormatError("Label map not found in file");
           typename std::map<std::string, Arc>::iterator it =
             _arc_index.find(tokens[label_index]);
@@ -1036,5 +1045,5 @@
             std::ostringstream msg;
             msg << "Arc with label not found: " << tokens[label_index];
-            throw DataFormatError(msg.str().c_str());
+            throw FormatError(msg.str());
           }
           a = it->second;
@@ -1061,9 +1070,9 @@
         std::string attr, token;
         if (!_reader_bits::readToken(line, attr))
-          throw DataFormatError("Attribute name not found");
+          throw FormatError("Attribute name not found");
         if (!_reader_bits::readToken(line, token))
-          throw DataFormatError("Attribute value not found");
+          throw FormatError("Attribute value not found");
         if (line >> c)
-          throw DataFormatError("Extra character on the end of line");
+          throw FormatError("Extra character on the end of line");
 
         {
@@ -1072,5 +1081,5 @@
             std::ostringstream msg;
             msg << "Multiple occurence of attribute " << attr;
-            throw DataFormatError(msg.str().c_str());
+            throw FormatError(msg.str());
           }
           read_attr.insert(attr);
@@ -1094,5 +1103,5 @@
           std::ostringstream msg;
           msg << "Attribute not found in file: " << it->first;
-          throw DataFormatError(msg.str().c_str());
+          throw FormatError(msg.str());
         }
       }
@@ -1110,5 +1119,5 @@
       LEMON_ASSERT(_is != 0, "This reader assigned to an other reader");
       if (!*_is) {
-        throw DataFormatError("Cannot find file");
+        throw FormatError("Cannot find file");
       }
 
@@ -1130,5 +1139,5 @@
 
           if (line >> c)
-            throw DataFormatError("Extra character on the end of line");
+            throw FormatError("Extra character on the end of line");
 
           if (section == "nodes" && !nodes_done) {
@@ -1152,6 +1161,7 @@
             skipSection();
           }
-        } catch (DataFormatError& error) {
+        } catch (FormatError& error) {
           error.line(line_num);
+          error.file(_filename);
           throw;
         }
@@ -1159,13 +1169,13 @@
 
       if (!nodes_done) {
-        throw DataFormatError("Section @nodes not found");
+        throw FormatError("Section @nodes not found");
       }
 
       if (!arcs_done) {
-        throw DataFormatError("Section @arcs not found");
+        throw FormatError("Section @arcs not found");
       }
 
       if (!attributes_done && !_attributes.empty()) {
-        throw DataFormatError("Section @attributes not found");
+        throw FormatError("Section @attributes not found");
       }
 
@@ -1245,4 +1255,5 @@
     std::istream* _is;
     bool local_is;
+    std::string _filename;
 
     Graph& _graph;
@@ -1294,7 +1305,10 @@
     /// file.
     GraphReader(const std::string& fn, Graph& graph)
-      : _is(new std::ifstream(fn.c_str())), local_is(true), _graph(graph),
+      : _is(new std::ifstream(fn.c_str())), local_is(true),
+        _filename(fn), _graph(graph),
         _use_nodes(false), _use_edges(false),
-        _skip_nodes(false), _skip_edges(false) {}
+        _skip_nodes(false), _skip_edges(false) {
+      if (!(*_is)) throw IoError(fn, "Cannot open file");
+    }
 
     /// \brief Constructor
@@ -1303,7 +1317,10 @@
     /// file.
     GraphReader(const char* fn, Graph& graph)
-      : _is(new std::ifstream(fn)), local_is(true), _graph(graph),
+      : _is(new std::ifstream(fn)), local_is(true),
+        _filename(fn), _graph(graph),
         _use_nodes(false), _use_edges(false),
-        _skip_nodes(false), _skip_edges(false) {}
+        _skip_nodes(false), _skip_edges(false) {
+      if (!(*_is)) throw IoError(fn, "Cannot open file");
+    }
 
     /// \brief Destructor
@@ -1674,5 +1691,5 @@
         if (readSuccess() && line) line.putback(c);
         if (!_node_maps.empty())
-          throw DataFormatError("Cannot find map names");
+          throw FormatError("Cannot find map names");
         return;
       }
@@ -1688,5 +1705,5 @@
             std::ostringstream msg;
             msg << "Multiple occurence of node map: " << map;
-            throw DataFormatError(msg.str().c_str());
+            throw FormatError(msg.str());
           }
           maps.insert(std::make_pair(map, index));
@@ -1700,5 +1717,5 @@
             std::ostringstream msg;
             msg << "Map not found in file: " << _node_maps[i].first;
-            throw DataFormatError(msg.str().c_str());
+            throw FormatError(msg.str());
           }
           map_index[i] = jt->second;
@@ -1724,9 +1741,9 @@
             std::ostringstream msg;
             msg << "Column not found (" << i + 1 << ")";
-            throw DataFormatError(msg.str().c_str());
+            throw FormatError(msg.str());
           }
         }
         if (line >> std::ws >> c)
-          throw DataFormatError("Extra character on the end of line");
+          throw FormatError("Extra character on the end of line");
 
         Node n;
@@ -1737,5 +1754,5 @@
         } else {
           if (label_index == -1)
-            throw DataFormatError("Label map not found in file");
+            throw FormatError("Label map not found in file");
           typename std::map<std::string, Node>::iterator it =
             _node_index.find(tokens[label_index]);
@@ -1743,5 +1760,5 @@
             std::ostringstream msg;
             msg << "Node with label not found: " << tokens[label_index];
-            throw DataFormatError(msg.str().c_str());
+            throw FormatError(msg.str());
           }
           n = it->second;
@@ -1767,5 +1784,5 @@
         if (readSuccess() && line) line.putback(c);
         if (!_edge_maps.empty())
-          throw DataFormatError("Cannot find map names");
+          throw FormatError("Cannot find map names");
         return;
       }
@@ -1781,5 +1798,5 @@
             std::ostringstream msg;
             msg << "Multiple occurence of edge map: " << map;
-            throw DataFormatError(msg.str().c_str());
+            throw FormatError(msg.str());
           }
           maps.insert(std::make_pair(map, index));
@@ -1793,5 +1810,5 @@
             std::ostringstream msg;
             msg << "Map not found in file: " << _edge_maps[i].first;
-            throw DataFormatError(msg.str().c_str());
+            throw FormatError(msg.str());
           }
           map_index[i] = jt->second;
@@ -1816,8 +1833,8 @@
 
         if (!_reader_bits::readToken(line, source_token))
-          throw DataFormatError("Node u not found");
+          throw FormatError("Node u not found");
 
         if (!_reader_bits::readToken(line, target_token))
-          throw DataFormatError("Node v not found");
+          throw FormatError("Node v not found");
 
         std::vector<std::string> tokens(map_num);
@@ -1826,9 +1843,9 @@
             std::ostringstream msg;
             msg << "Column not found (" << i + 1 << ")";
-            throw DataFormatError(msg.str().c_str());
+            throw FormatError(msg.str());
           }
         }
         if (line >> std::ws >> c)
-          throw DataFormatError("Extra character on the end of line");
+          throw FormatError("Extra character on the end of line");
 
         Edge e;
@@ -1841,5 +1858,5 @@
             std::ostringstream msg;
             msg << "Item not found: " << source_token;
-            throw DataFormatError(msg.str().c_str());
+            throw FormatError(msg.str());
           }
           Node source = it->second;
@@ -1849,5 +1866,5 @@
             std::ostringstream msg;
             msg << "Item not found: " << target_token;
-            throw DataFormatError(msg.str().c_str());
+            throw FormatError(msg.str());
           }
           Node target = it->second;
@@ -1858,5 +1875,5 @@
         } else {
           if (label_index == -1)
-            throw DataFormatError("Label map not found in file");
+            throw FormatError("Label map not found in file");
           typename std::map<std::string, Edge>::iterator it =
             _edge_index.find(tokens[label_index]);
@@ -1864,5 +1881,5 @@
             std::ostringstream msg;
             msg << "Edge with label not found: " << tokens[label_index];
-            throw DataFormatError(msg.str().c_str());
+            throw FormatError(msg.str());
           }
           e = it->second;
@@ -1889,9 +1906,9 @@
         std::string attr, token;
         if (!_reader_bits::readToken(line, attr))
-          throw DataFormatError("Attribute name not found");
+          throw FormatError("Attribute name not found");
         if (!_reader_bits::readToken(line, token))
-          throw DataFormatError("Attribute value not found");
+          throw FormatError("Attribute value not found");
         if (line >> c)
-          throw DataFormatError("Extra character on the end of line");
+          throw FormatError("Extra character on the end of line");
 
         {
@@ -1900,5 +1917,5 @@
             std::ostringstream msg;
             msg << "Multiple occurence of attribute " << attr;
-            throw DataFormatError(msg.str().c_str());
+            throw FormatError(msg.str());
           }
           read_attr.insert(attr);
@@ -1922,5 +1939,5 @@
           std::ostringstream msg;
           msg << "Attribute not found in file: " << it->first;
-          throw DataFormatError(msg.str().c_str());
+          throw FormatError(msg.str());
         }
       }
@@ -1956,5 +1973,5 @@
 
           if (line >> c)
-            throw DataFormatError("Extra character on the end of line");
+            throw FormatError("Extra character on the end of line");
 
           if (section == "nodes" && !nodes_done) {
@@ -1978,6 +1995,7 @@
             skipSection();
           }
-        } catch (DataFormatError& error) {
+        } catch (FormatError& error) {
           error.line(line_num);
+          error.file(_filename);
           throw;
         }
@@ -1985,13 +2003,13 @@
 
       if (!nodes_done) {
-        throw DataFormatError("Section @nodes not found");
+        throw FormatError("Section @nodes not found");
       }
 
       if (!edges_done) {
-        throw DataFormatError("Section @edges not found");
+        throw FormatError("Section @edges not found");
       }
 
       if (!attributes_done && !_attributes.empty()) {
-        throw DataFormatError("Section @attributes not found");
+        throw FormatError("Section @attributes not found");
       }
 
@@ -2055,4 +2073,5 @@
     std::istream* _is;
     bool local_is;
+    std::string _filename;
 
     typedef std::map<std::string, _reader_bits::Section*> Sections;
@@ -2075,5 +2094,8 @@
     /// Construct a section reader, which reads from the given file.
     SectionReader(const std::string& fn)
-      : _is(new std::ifstream(fn.c_str())), local_is(true) {}
+      : _is(new std::ifstream(fn.c_str())), local_is(true),
+        _filename(fn) {
+      if (!(*_is)) throw IoError(fn, "Cannot open file");
+    }
 
     /// \brief Constructor
@@ -2081,5 +2103,8 @@
     /// Construct a section reader, which reads from the given file.
     SectionReader(const char* fn)
-      : _is(new std::ifstream(fn)), local_is(true) {}
+      : _is(new std::ifstream(fn)), local_is(true),
+        _filename(fn) {
+      if (!(*_is)) throw IoError(fn, "Cannot open file");
+    }
 
     /// \brief Destructor
@@ -2237,10 +2262,10 @@
 
           if (line >> c)
-            throw DataFormatError("Extra character on the end of line");
+            throw FormatError("Extra character on the end of line");
 
           if (extra_sections.find(section) != extra_sections.end()) {
             std::ostringstream msg;
             msg << "Multiple occurence of section " << section;
-            throw DataFormatError(msg.str().c_str());
+            throw FormatError(msg.str());
           }
           Sections::iterator it = _sections.find(section);
@@ -2251,6 +2276,7 @@
           readLine();
           skipSection();
-        } catch (DataFormatError& error) {
+        } catch (FormatError& error) {
           error.line(line_num);
+          error.file(_filename);
           throw;
         }
@@ -2261,5 +2287,5 @@
           std::ostringstream os;
           os << "Cannot find section: " << it->first;
-          throw DataFormatError(os.str().c_str());
+          throw FormatError(os.str());
         }
       }
@@ -2361,5 +2387,7 @@
     /// file.
     LgfContents(const std::string& fn)
-      : _is(new std::ifstream(fn.c_str())), local_is(true) {}
+      : _is(new std::ifstream(fn.c_str())), local_is(true) {
+      if (!(*_is)) throw IoError(fn, "Cannot open file");
+    }
 
     /// \brief Constructor
@@ -2368,5 +2396,7 @@
     /// file.
     LgfContents(const char* fn)
-      : _is(new std::ifstream(fn)), local_is(true) {}
+      : _is(new std::ifstream(fn)), local_is(true) {
+      if (!(*_is)) throw IoError(fn, "Cannot open file");
+    }
 
     /// \brief Destructor
