我在下面的问题中遇到了一些错误。问题陈述是 如下:
编写一个程序,读取两个输入文件,这些文件的行按键排序 数据字段。您的程序应合并这两个文件,编写输出文件 包含键字段排序的两个文件中的所有行。作为一个 例如,如果两个输入文件包含特定的学生姓名和成绩 按名称排序的类,合并信息如下所示。
文件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'|
我在这里使用了错误的头文件吗?
答案 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;
和ifstream
有ofstream
,但您使用的是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 数字是函数的表达式或参数中的数字常量,没有注释或描述。使用带有描述性标识符名称的#define
或const unsigned int
。
通过命名常量,您只需在常量更改时进行一次更改。看看你的节目。如果将常数100更改为150,则需要执行多少更改?
使用记录
使用结构来描述输入文件的记录。每列都是结构中的数据成员。
该结构将允许您通过关键字段轻松比较两个记录。
使用std :: vector
不要使用数组。请改用std::vector<Record>
。矢量在运行时自动调整。对于阵列,您必须监视大小并在超出容量时重新分配。
没有记录比较
要求说要读入数据并按关键字段进行比较。您没有比较任何关键字段。