Member 12899279 Ответов: 2

Как сравнить два файла построчно после хранения их в векторе


i have two text files named totalfiles.txt and uploaded.txt i am storing both of them in a vector now offcourse when this program will run for a very first time uploaded.txt will be made and it will be empty and first file will be written in it after its successfully uploaded to the server what i want is some kind of method to compare both .txt files so if files that are already uploaded to server don't get uploaded again so is there any method to do that in c++? again at the beginning i am going to store the files in vector and i need to do above operation via vector and not using .txt files directly with fstream


Что я уже пробовал:

ifstream read2("ScannedFiles.txt");
	ofstream read3("Problem.txt", ios::app);
	fstream uploaded("Uploaded.txt", ios::app);
	vector<string>filen2;
	vector<string>upl;
	string st3;
	string st2;
	while (getline(read2, st2))
	{
		if (st2.size() > 0)
			filen2.push_back(st2);
		else
			break;

	}
	while (getline(uploaded,st3))
	{
		if (st3.size() > 0)
			upl.push_back(st3);
		else
			break;
	}
<pre>	for (vector<string>::iterator t = filen2.begin(); t != filen2.end(); t++)

2 Ответов

Рейтинг:
2

Member 12899279

i think i figured it out below is the code

string hashi ="files";
ifstream read2("ScannedFiles.txt");
ofstream read3("Problem.txt", ios::app);
/// ofstream read4("Uploaded.txt", ios::app);
vector<string>filen2;
string st2;
while (getline(read2, st2))
{
if (st2.size() > 0)
filen2.push_back(st2);
else
break;

}
read2.close();
int a = filen2.size();
int b = a;
int h = 1;
for (vector<string>::iterator t = filen2.begin(); t != filen2.end(); t++)
{
string st3;
vector<string>upl;
ifstream uploaded("Uploaded.txt", ios::app);
while (getline(uploaded, st3))
{
if (st3.size() > 0)
upl.push_back(st3);
else
break;
}
uploaded.close();
int c = upl.size();

int i = 0;

string currfil = t[i];
string name = getFileName(currfil);
bool toWrite = true;

for (vector<string>::iterator t2 = upl.begin(); t2 != upl.end(); t2++)
{
int j = 0;
if (c <= 0)
break;
else
{
if (t2[j] == currfil)
{

toWrite = false;
}
}
}
if (toWrite == true)
{


CURL *curl;
CURLcode res;

curl_httppost* post = NULL;
curl_httppost* last = NULL;
/*HttpPost* post = NULL;
HttpPost* last = NULL;*/
//string name = "CV.pdf";
//string path = "E:\\BIMS Uni\\CV.pdf";
//string name = getFileName(path);
// string request = "Md5=" + hashi;
curl = curl_easy_init();
if (curl)
{
// curl_easy_setopt(curl, CURLOPT_POSTFIELDS, request.c_str());
curl_formadd(&post, &last,
CURLFORM_COPYNAME, "Md5",
CURLFORM_COPYCONTENTS, hashi.c_str(),
CURLFORM_END);
curl_formadd(&post, &last,
CURLFORM_COPYNAME, "name2",
CURLFORM_COPYCONTENTS, name.c_str(),
CURLFORM_END);
curl_formadd(&post, &last,
CURLFORM_COPYNAME, "file2",
CURLFORM_FILE, currfil.c_str(),
CURLFORM_END);



curl_easy_setopt(curl, CURLOPT_URL, "http://localhost:8081/PCInfo/test.php");

curl_easy_setopt(curl, CURLOPT_HTTPPOST, post);
curl_easy_setopt(curl, CURLOPT_TIMEOUT, 20L);


res = curl_easy_perform(curl);
if (res == 28)
{
read3 << currfil << endl;
//h = h + 1;

}
if (res == 26)
{
//return 0;
read3 << currfil << endl;
//h = h + 1;

}
if (res == 0)
{
// uploaded.close();
ofstream uploaded("Uploaded.txt", ios::app);
uploaded << currfil << endl;
uploaded.close();
}

curl_formfree(post);
}
/*else
{
return 0;
}*/

curl_easy_cleanup(curl);
}
}
return 0;
i am still looking for a more better and clean way because i think it will take too much time


Stefan_Lang

Несколько вопросов:

1. Пожалуйста, не публикуйте свои собственные комментарии или дополнительные вопросы в качестве решения! Если только это не проверенное решение, которое вы успешно проверили, чтобы работать именно так, как вы намеревались! Ваш код, очевидно, не является полным решением, поэтому не публикуйте его как таковой.

2. добавьте любые новые идеи и вопросы к вашей первоначальной публикации! Вот для чего нужна зеленая кнопка [улучшить вопрос] в правом нижнем углу вашего вопроса! (Подсказка: он виден только тогда, когда вы наводите указатель мыши на свой вопрос)

3. пожалуйста, потратьте немного усилий на форматирование ваших сообщений осмысленным образом! Вы только что использовали стандартный тег форматирования для всей публикации, включая код и обычный текст. Это никому не поможет.
3.а) сделайте отдельный текст, код и другие элементы, а затем отформатируйте их отдельно с наиболее подходящими опциями. Текст обычно вообще не должен использовать тег форматирования; код должен использовать соответствующий тег code+language.
3.б) вам не нужно писать эти теги форматирования вручную; вместо этого вы можете просто выбрать блок, который хотите отформатировать, и использовать теги форматирования в верхней части поля редактирования.
3.В) Вы даже можете просмотреть результаты перед публикацией - используйте эту функцию и не публикуйте, если она выглядит не так, как вы ожидали!
3.d) сделайте отступ в коде. перед публикацией или убедитесь, что уже выделенный код не потеряет его. Никто не хочет читать стену текста и разбираться, что к чему!

4. ваши циклы чтения файлов могут работать не так, как ожидалось, из-за двух проблем:
4.a) getline() возвращает объект istream, а не bool. Использование его в качестве условия не имеет никакого смысла. Вместо этого вы должны вызвать соответствующую функцию для проверки состояния объекта istream, например good().
Видишь ли http://www.cplusplus.com/reference/istream/istream/
4.Б) почему вы выходите из цикла после встречи с пустой строкой?

Разве после пустой строки не может быть больше текста?? См. 4.а) о правильной проверке конца файла!
4.В) Я не проверял подробно, но, похоже, ваш код выполняет полнотекстовое сравнение. Для этого вам необходимо эффективно скопировать удаленный файл. Разве это не делает весь процесс устаревшим? Разве вы не хотели избежать копирования всего файла по сети без необходимости? Почему же тогда вы делаете именно это в самом начале своей программы?

Рейтинг:
0

OriginalGriff

Начните с простого маршрута: вычислите хэш-код для всего файла и сохраните его вместе с файлом. (MD5 технически сломан, но для приложения, не связанного с безопасностью, он быстрее, чем SHA-я бы, вероятно, использовал это).
Затем, когда произойдет загрузка файла, вычислите его хэш-код и сравните его с вашей коллекцией существующих. Если ее там нет, значит, она действительно новая. Если это так, то есть вероятность, что файлы там уже есть (хэш-коллизия MD5/SHA довольно редка, но затем вы можете сделать исчерпывающее сравнение с гораздо более ограниченным количеством совпадающих файлов, чтобы проверить символ за символом)


Member 12899279

я сохраняю полный путь к файлу, который я загружаю в систему. uploaded.txt поэтому все, что ему нужно сделать, это проверить в следующий раз перед загрузкой, сопоставив путь из totalfiles.txt с помощью uploaded.txt если он найдет его в uploaded.txt тогда оставьте его и не загружайте иначе загрузите его

это АСН например

totalfiles.txt есть следующие файлы:-

C:\Program Файлы\\Андроида Studio\bin\lldb\lib\plat-irix5\readcd.doc
C:\Program Файлы\\Андроида Studio\bin\lldb\lib\plat-irix6\readcd.doc
C:\Program файлы\JetBrains\PyCharm Community Edition 2019.2.3\help\ReferenceCard.pdf
C:\Program файлы\JetBrains\PyCharm Community Edition 2019.2.3\help\ReferenceCardForMac.pdf
C:\Program файлы\NetBeans 8.0.2\nb\shortcuts_mac.pdf

uploadedFiles.txt есть следующие файлы:-

C:\Program Файлы\\Андроида Studio\bin\lldb\lib\plat-irix6\readcd.doc
C:\Program файлы\JetBrains\PyCharm Community Edition 2019.2.3\help\ReferenceCard.pdf

Теперь все, что ему нужно сделать перед загрузкой, - это проверить, присутствует ли какая-либо из строк уже в нем. uploadedfiles.txt тогда не загружайте иначе загружайте

Stefan_Lang

Какой смысл скачивать загруженный файл для сравнения только для того, чтобы предотвратить ненужную загрузку? Вы не уменьшаете сетевой трафик таким образом - наоборот, вы его увеличиваете!

Решение делает очень разумное предложение: вместо того, чтобы сравнивать все файлы, храните хэш с каждым файлом и только сравнивайте хэши. Таким образом, вам нужно только загрузить хэш загруженного файла для тестирования. Разве это не то, чего ты хочешь?

Stefan_Lang

Очень разумное предложение. Есть 5.