0

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

这是我得到的代码。但发生的事情是它打印出文件,然后再次打印出第二行而不是寻找重复项......

谁能告诉我我哪里出错了。对 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;
 }
4

2 回答 2

1

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

 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;
}
于 2013-04-24T02:38:36.570 回答
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] << " ";
}  
于 2013-04-24T02:53:21.480 回答