合并两个文件

时间:2014-04-18 19:15:58

标签: c++ file-io

我在下面的问题中遇到了一些错误。问题陈述是 如下:

  

编写一个程序,读取两个输入文件,这些文件的行按键排序   数据字段。您的程序应合并这两个文件,编写输出文件   包含键字段排序的两个文件中的所有行。作为一个   例如,如果两个输入文件包含特定的学生姓名和成绩   按名称排序的类,合并信息如下所示。

     

文件1:

Adams   C
Jones   D
King   B
  

文件2:

Barnes   A
Johnson   C
  

输出文件:

Adams   C
Barnes   A
Johnson   C
Jones   D
King   B
  

您必须一次读取一行文件并写入或写入最后一行   行从其他数据文件读取到输出文件。一个常见的合并   算法如下:

Read a line from each data file
While the end of both files has not been reached
    If the line from file 1 is smaller than the line from file 2
            Write the line from file 2 to the output file and read a new line from file 1
    Else
            Write the line from file 2 to the output file and read a new line from file 2.
Write the remaining lines (if any) from file 1 to the output file.
Write the remaining lines (if any) from file 2 to the output file.

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

using namespace std;

void merge() {
  ifstream ifile1("input1.txt");
  ifstream ifile2("input2.txt");
  ofstream ofile("output.txt");
  std::string temp1;
  std::string temp2;

  ifile1.getline(temp1, 100);
  ifile2.getline(temp2, 100);

  while (ifile1 != EOF AND ifile2 != eof) {
    while (temp1[i++] != "\n")
      ;
    while (temp2[j++] != "\n")
      ;
    if (i < j) {
      ofile << temp2;
      ifile1.getline(temp1, 100);
    } else {
      ofile << temp1;
      ifile2.getline(temp2, 100);
    }
  }
  if (ifile1 != eof) {
    ifile1.getline(temp1, 100);
    ofile << temp1;
  }
  if (ifile2 != eof) {
    ifile2.getline(temp1, 100);
    ofile << temp1;
  }
}

int main() {
  merge();
}

这些是我得到的错误

C:\Users\Ndekwu\Downloads\merge.cpp||In function 'void merge()':|
C:\Users\Ndekwu\Downloads\merge.cpp|5|error: 'ifstream' was not declared in this scope|
C:\Users\Ndekwu\Downloads\merge.cpp|5|note: suggested alternative:|
c:\program files (x86)\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.7.1\include\c++\iosfwd|159|note: 'std::ifstream'|
C:\Users\Ndekwu\Downloads\merge.cpp|5|error: expected ';' before 'ifile1'|
C:\Users\Ndekwu\Downloads\merge.cpp|6|error: expected ';' before 'ifile2'|
C:\Users\Ndekwu\Downloads\merge.cpp|7|error: 'ofstream' was not declared in this scope|
C:\Users\Ndekwu\Downloads\merge.cpp|7|note: suggested alternative:|
c:\program files (x86)\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.7.1\include\c++\iosfwd|162|note: 'std::ofstream'|
C:\Users\Ndekwu\Downloads\merge.cpp|7|error: expected ';' before 'ofile'|
C:\Users\Ndekwu\Downloads\merge.cpp|11|error: 'ifile1' was not declared in this scope|
C:\Users\Ndekwu\Downloads\merge.cpp|12|error: 'ifile2' was not declared in this scope|
C:\Users\Ndekwu\Downloads\merge.cpp|14|error: 'eof' was not declared in this scope|
C:\Users\Ndekwu\Downloads\merge.cpp|14|error: expected ')' before 'AND'|

我在这里使用了错误的头文件吗?

1 个答案:

答案 0 :(得分:2)

以下是我发现的一些问题:

while之后的分号
这一行:

while(temp1[i++]!="\n");  
                       ^This could be a problem.

没有功能。 &#39;;&#39;终止while语句;没有循环内容。就目前而言,它看起来像一个可变延迟循环,它取决于第一个不是行结尾的字符。

阅读直至EOF
使用eof功能将导致您的上次读取被处理两次,因为在读取操作之后才会检测到EOF。

更改为:while (getline(input_file, text))

std 的一致性 您using namespace std;ifstreamofstream,但您使用的是std::string。您应该保持一致,并使用std::ifstream或从std删除std::string

另外,请勿使用using namespace std;,因为它过于宽泛。具体列出您正在使用的std命名空间项:

using std::ifstream;
using std::string;
using std::cout;

main功能
无论编译器如何接受其他变体,void main() 错误,因为main()会向操作系统返回int

正确使用标准include个文件
标头文件应为<fstream><iostream>,不包含.h扩展名 还要检查您使用的是C ++编译器而不是C语言编译器。验证编译器是否使用C ++语言。例如,C语言没有fstream头文件。

请勿使用 magic 数字
magic 数字是函数的表达式或参数中的数字常量,没有注释或描述。使用带有描述性标识符名称的#defineconst unsigned int

通过命名常量,您只需在常量更改时进行一次更改。看看你的节目。如果将常数100更改为150,则需要执行多少更改?

使用记录
使用结构来描述输入文件的记录。每列都是结构中的数据成员。

该结构将允许您通过关键字段轻松比较两个记录。

使用std :: vector
不要使用数组。请改用std::vector<Record>。矢量在运行时自动调整。对于阵列,您必须监视大小并在超出容量时重新分配。

没有记录比较
要求说要读入数据并按关键字段进行比较。您没有比较任何关键字段。