我试图在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;
}
答案 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] << " ";
}