c ++从文件中删除重复的数字

时间:2013-04-24 02:32:34

标签: c++ arrays file duplicates

我试图在c ++中制作一个可以通过txt文件工作的程序,如果这个文件中的数字有重复,不要打印它们,只打印出一次出现的数字。

这是我得到的代码。但是会发生什么呢?它打印出文件,然后再打印出第二行,而不是寻找dublicates ......

任何人都可以告诉我哪里出错了。相当新的c ++

// array.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main ()
{
    int array[100]; // creates array to hold numbers
    short loop=0; //short for loop for input
    string line; //this will contain the data read from the file
    ifstream myfile ("problem3.txt"); //opening the file.
    if (myfile.is_open()) //if the file is open
    {
        while (! myfile.eof() ) //while the end of file is NOT reached
        {
            getline (myfile,line); //get one line from the file
            array[loop] = line;
            cout << array[loop] << endl; //and output it
            loop++;
        }

        for (int i = 1; i < loop; i++)
        {
            bool matching = false;
            for (int j = 0; (j < i)&& (matching == false); j++)
            {
                 if (array[i] == array[j]) 
                      matching = true;
             }
             if (!matching) 
                cout<< array[i] << " "
        }   
        myfile.close(); //closing the file
     }
      else 
         cout << "Unable to open file"; //if the file is not open output
     system("PAUSE");
     return 0;
 }

2 个答案:

答案 0 :(得分:1)

至少有一个错误:array被声明为整数数组,您正在读取字符串line并直接将string分配给int

 getline (myfile,line); //^^line is string, array[i] is int
 array[loop] = line;

您可以尝试在向量中读取这些行,然后调用std :: unique以使向量唯一并将其打印出来。您的文件行不一定是整数行,因此将它们存储在整数数组中可能无效。

您可以尝试:

#include <vector>
#include <string>
#include <algorithm>
#include <iterator> 

int main()
{
    std::vector<std::string> data;
    ifstream myfile ("problem3.txt");
    string line;
    //if not required to use array
    while (getline(myfile, line))
    {
      data.push_back(line);
    }

    std::vector<std::string> data(dataArray, dataArray + 100);

    myfile.close();
    std::sort( data.begin(), data.end() );
    data.erase( std::unique( data.begin(), data.end()), data.end() );
    //now print vector out:
    std::copy(data.begin(), data.end(), ostream_iterator<string>(cout, " \n"));
    return 0;
}

答案 1 :(得分:0)

我建议使用数组来计算某个整数出现的次数,而不是使用嵌套的for循环。然后,您可以循环一次,只打印计数为1的整数。

嵌套for循环的一个问题是,因为你只是在j < i检查重复项,所以你可能会打印一个整数,即使它稍后在数组中有重复。您只需检查整个数组以确保没有重复项。

如果你还想尝试,你可能想做这样的事情:

for (int i = 0; i < loop; i++) // start at 0!
{
   bool matching = false;
   for (int j=0; j<loop; j++) { // check the whole array for duplicates!
       if (i != j && array[i] == array[j]) {
           matching = true;
           break; // instead of complicated condition in for loop
       }
   }
   if (!matching) cout << array[i] << " ";
}