首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

新手请问大神关于文件流!

2013-06-25 
新手请教大神关于文件流!!!请教大神:比如我有两个文档,分别都是1~9,怎么把第一个文档的数据读出来和第二个

新手请教大神关于文件流!!!
请教大神:
比如我有两个文档,分别都是1~9,怎么把第一个文档的数据读出来和第二个文档的数据进行操作,然后把结果存在第三个文档?
比如把第一个文档的1分别和第二个文档的1~9相加,然后把第一个文档的2分别和第二个文档的1~9相加,以此类推,最后把数据存在第三个文档。
请问这个怎么用文件流实现呢?
如果运算不是固定的,比如有一个输入是第一个文档的数据,然后第二个输入是第二个文档的数据,但是运算是自己定义的运算,操作也是一样的吧?
请赐教新手请问大神关于文件流!新手请问大神关于文件流!
[解决办法]
只供参考

#include <algorithm>
#include <fstream>
#include <list>
#include <set>
#include <string>
  
namespace {
std::string kF1 = "1.txt";
std::string kF2 = "2.txt";
const char kDelimiter = ' ';
} // namespace
  
// Before loading data to container, there is a chance to modify a line by using
// paramter function_process_line who is a function pointer.
// Set it NULL, if you need not preprocess an input line.
template<typename ContainerType>
ContainerType LoadDataToContainer(const std::string& filename,
                                  void(*function_process_line)(std::string&)) {
  std::ifstream infile(filename, std::ios_base::in);
  if (!infile) {
    throw std::ios_base::failure("Failed to open file: " + filename);
  }
  
  ContainerType container;
  std::string line;
  while (infile) {
    std::getline(infile, line);
    if (line.empty()) {
      break;
    }
  
    if (function_process_line) {
      function_process_line(line);
    }
    // Note: parameter 1 is not meaningful to any container type.
    container.insert(container.end(), line);
  }
  infile.close();
  
  return container;
}
  
template<typename IteratorType>
void WriteDataToFile(
    const std::string& filename, const IteratorType& b, const IteratorType& e) {
  std::ofstream outfile(filename, std::ios_base::out);
  if (!outfile) {
    throw std::ios_base::failure("Failed to open file: " + filename);
  }
  
  for (IteratorType iter = b; iter != e; ++iter) {
    outfile << *iter << std::endl;
  }
  


  outfile.close();
}
  
inline void RetainOnlyFirstColumn(std::string& line) {
  // To keep things simple, it is assumed there must be kDelimiter in line.
  line.erase(line.begin() + line.find(kDelimiter), line.begin() + line.size());
}
  
int main(int argc, char* argv[]) {
  auto s = LoadDataToContainer<std::set<std::string>>(kF1, RetainOnlyFirstColumn);
  auto l = LoadDataToContainer<std::list<std::string>>(kF2, NULL);
  
  for (auto iter = l.begin(); iter != l.end();
       iter = (s.find(iter->substr(0 ,iter->find(kDelimiter))) != s.end()) ?
       l.erase(iter) : ++iter
  );
  
  WriteDataToFile(kF2, l.begin(), l.end());
}


[解决办法]
哪里不懂注释哪里,没法全面解释

引用:
Quote: 引用:

只供参考

#include <algorithm>
#include <fstream>
#include <list>
#include <set>
#include <string>
  
namespace {
std::string kF1 = "1.txt";
std::string kF2 = "2.txt";
const char kDelimiter = ' ';
} // namespace
  
// Before loading data to container, there is a chance to modify a line by using
// paramter function_process_line who is a function pointer.
// Set it NULL, if you need not preprocess an input line.
template<typename ContainerType>
ContainerType LoadDataToContainer(const std::string& filename,
                                  void(*function_process_line)(std::string&)) {
  std::ifstream infile(filename, std::ios_base::in);
  if (!infile) {
    throw std::ios_base::failure("Failed to open file: " + filename);
  }
  
  ContainerType container;
  std::string line;
  while (infile) {
    std::getline(infile, line);
    if (line.empty()) {
      break;
    }
  
    if (function_process_line) {
      function_process_line(line);
    }
    // Note: parameter 1 is not meaningful to any container type.
    container.insert(container.end(), line);
  }
  infile.close();
  
  return container;
}
  
template<typename IteratorType>
void WriteDataToFile(
    const std::string& filename, const IteratorType& b, const IteratorType& e) {


  std::ofstream outfile(filename, std::ios_base::out);
  if (!outfile) {
    throw std::ios_base::failure("Failed to open file: " + filename);
  }
  
  for (IteratorType iter = b; iter != e; ++iter) {
    outfile << *iter << std::endl;
  }
  
  outfile.close();
}
  
inline void RetainOnlyFirstColumn(std::string& line) {
  // To keep things simple, it is assumed there must be kDelimiter in line.
  line.erase(line.begin() + line.find(kDelimiter), line.begin() + line.size());
}
  
int main(int argc, char* argv[]) {
  auto s = LoadDataToContainer<std::set<std::string>>(kF1, RetainOnlyFirstColumn);
  auto l = LoadDataToContainer<std::list<std::string>>(kF2, NULL);
  
  for (auto iter = l.begin(); iter != l.end();
       iter = (s.find(iter->substr(0 ,iter->find(kDelimiter))) != s.end()) ?
       l.erase(iter) : ++iter
  );
  
  WriteDataToFile(kF2, l.begin(), l.end());
}


啊,先谢过!
但是。。。能解释一下吗。。。

热点排行