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

蓝风翼影 2013-06-06 02:34:16
请教大神:
比如我有两个文档,分别都是1~9,怎么把第一个文档的数据读出来和第二个文档的数据进行操作,然后把结果存在第三个文档?
比如把第一个文档的1分别和第二个文档的1~9相加,然后把第一个文档的2分别和第二个文档的1~9相加,以此类推,最后把数据存在第三个文档。
请问这个怎么用文件流实现呢?
如果运算不是固定的,比如有一个输入是第一个文档的数据,然后第二个输入是第二个文档的数据,但是运算是自己定义的运算,操作也是一样的吧?
请赐教
...全文
84 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
turing-complete 2013-06-06
  • 打赏
  • 举报
回复
哪里不懂注释哪里,没法全面解释
引用 2 楼 u010586408 的回复:
[quote=引用 1 楼 mougaidong 的回复:] 只供参考
#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]
蓝风翼影 2013-06-06
  • 打赏
  • 举报
回复
引用 1 楼 mougaidong 的回复:
只供参考
#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());
}
啊,先谢过! 但是。。。能解释一下吗。。。
turing-complete 2013-06-06
  • 打赏
  • 举报
回复
只供参考
#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());
}

64,692

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧