[질문] 2파일을 비교해서 중복된 라인 제거하기
글쓴이: psycoder / 작성시간: 목, 2004/08/19 - 3:19오전
a.txt와 b.txt 두 파일을 비교해서 중복된 라인을 제거하고자 합니다.
int main(void)
{
int flag=1;
FILE *fp1, *fp2, *fp3;
char file1[1024]={0}, file2[1024]={0};
fp1=fopen("./a.txt", "r");
fp2=fopen("./b.txt", "r");
while(fgets(file1, sizeof(file1), fp1) !=NULL) {
while(fgets(file2, sizeof(file2), fp2) !=NULL) {
if(!strcmp(file1, file2)) {
flag=0;
break;
}
else {
flag=1;
continue;
}
}
if(flag==1) {
fp3=fopen("./c.txt", "a");
fprintf(fp3, "%s", file1);
fclose(fp3);
}
continue;
}
fclose(fp2);
fclose(fp1);
return 0;
}이렇게 만들어봤는데요..
여기서 잘못된게 있나요?
실행해보면 바깥쪽 while() 루프가 한번밖에 실행되지 않습니다.
즉, a.txt 1라인만 b.txt 전체 라인과 비교한후 그냥 끝나버립니다.
답변에 미리 감사드립니다.
Forums:


(파일)스트림을 읽거나 쓸때는 앞에서 뒤로만 단 한번만 이동합니다.위
(파일)스트림을 읽거나 쓸때는 앞에서 뒤로만 단 한번만 이동합니다.
위에서처럼 루프를 돌기 위해 스트림의 처음(bos: begin of stream)으로 이동하려면, 파일을 닫고 다시 열거나, 파일 포인터를 bos로 수동으로 이동시켜줄 필요가 있습니다.
매번 루프를 돌때 마다 이런 작업을 한다면, 파일 I/O 속도가 느리기 때문에 프로그램이 상당히 느려집니다. 아예 파일을 전부 메모리에 올려놓고 루프를 돌리는것이 코딩하기도 편하고 속도도 빨라집니다.
제가 C++로 작성한 다음 코드를 참고하세요.
//--------------------------------------------------------------------------- #include <iostream> #include <fstream> #include <string> #pragma hdrstop #include <vector> #include <iterator> #include <algorithm> //--------------------------------------------------------------------------- template <typename T> struct line { T str_; line() {} line(const std::string& s) : str_(s) {} operator T() const { return str_; } }; template <typename T> std::istream& operator>>(std::istream& is, line<T>& sl) { return std::getline(is, sl.str_); } template <typename T, typename ForwardIterator> class find_pred { public: find_pred(ForwardIterator first, ForwardIterator last) : first_(first), last_(last) {} bool operator()(const T& value) { ForwardIterator first(first_), last(last_); return std::find(first, last, value) != last; } private: ForwardIterator first_, last_; }; int main(int argc, char* argv[]) { using namespace std; if (argc >= 3) { ifstream fin1(argv[1]), fin2(argv[2]); ofstream fout3(argv[3]); istream_iterator<line<string> > eos, is_iter1(fin1), is_iter2(fin2); ostream_iterator<string> os_iter3(fout3, "\n"); vector<string> file2(is_iter2, eos); remove_copy_if(is_iter1, eos, os_iter3, find_pred<string, vector<string>::iterator>(file2.begin(), file2.end())); } return 0; } //---------------------------------------------------------------------------댓글 달기