Problem z biblioteka zlib w Eclipse

0

Cześć,
ostatnio zainstalowałem bibliotekę zlib na Linuxie. Niestety, po jej dołączeniu, projekt nie kompiluje się. Pojawiają się następujące błędy:
undefined reference to gzopen', undefined reference to gzwrite', undefined reference to `gzclose'.

Znalazłem informację o tym, że należy dodać opcję -lz w makefilu, aby naprawić ten problem. Nie wiem jednak jak to zrobić z poziomu Eclipse.

0

Dzięki, dołączyłem bibliotekę do projektu. Napisałem prosty program, w którym zapisuje dane do pliku, a potem chcę je odczytać. Niestety pojawiają się śmieci. Poniżej zamieszczam kod źródłowy oraz przykładowe wyjście:

#include <iostream>
#include <vector>
#include <string.h>
#include "/usr/local/include/zlib.h"

int main()
{
	std::string str;
	std::vector<const char*> records;
	std::vector<uint> writenBytesList;
	uint writenBytes;

	uint numberOfRecords = 0;
	records.reserve(3);
	writenBytesList.reserve(3);

	//clear old data
	gzFile gzfp = gzopen("output.txt.gz","w");
	gzclose(gzfp);


	char choice;
	std::cout << "Add record (q for quite): ";

	while(std::cin >> choice && choice != 'q')
	{
		if(numberOfRecords < 3)
		{
			gzFile gzfp = gzopen("output.txt.gz","ab");
			std::cout << "Enter text: ";
			std::string str;
			std::cin >> str;
			str += "\n";
			char buffer[str.size()+1];
			strcpy(buffer, str.c_str());
			writenBytes = gzwrite(gzfp, buffer, strlen(buffer));
			std::cout << "Written bytes: " << writenBytes << std::endl;
			gzclose(gzfp);
			writenBytesList.push_back(writenBytes);
			std::cout << "Added: " << str;
			++numberOfRecords;
			std::cout << "Add record (q for quite): ";
		}
		else
		{
			//read data from
			gzFile gzfp = gzopen("output.txt.gz","rb");
			for(auto it = writenBytesList.begin(); it != writenBytesList.end(); ++it)
			{
				char buffer[*it];
				std::cout <<"Bytes to be read: " << *it << std::endl;
				gzread(gzfp,buffer,*it);
				std::cout << "In buffer: " << buffer << std::endl;
				records.push_back(buffer);
			}

			for(auto it = records.begin(); it != records.end(); ++it)
			{
				std::cout << "Stored: " << *it << std::endl;
			}
			gzclose(gzfp);
		}
	}

	return 0;
}
Add record (q for quite): a
Enter text: Item1
Written bytes: 6
Added: Item1
Add record (q for quite): Texttttt2
Enter text: Written bytes: 9
Added: exttttt2
Add record (q for quite): b
Enter text: SimpleText
Written bytes: 11
Added: SimpleText
Add record (q for quite): c
Bytes to be read: 6
In buffer: Item1

Bytes to be read: 9
In buffer: exttttt2
���cU
Bytes to be read: 11
In buffer: SimpleText
�cU
Stored: 
Stored: 
Stored: 

0

char buffer[str.size()+1];
strcpy(buffer, str.c_str());
writenBytes = gzwrite(gzfp, buffer, strlen(buffer));


Po co ten zabieg z buforem (zresztą niezgodny z C++)? Przecież możesz zrobić tak:
```cpp
writenBytes = gzwrite(gzfp, str.c_str(), str.size());

Prawda, że prościej?

A tu Twój błąd:

std::vector<const char*> records;
...
char buffer[*it]; // <--- niezgodne z C++
...
records.push_back(buffer); //<--- dodajesz wskaźnik do lokalnej tablicy, która w trakcie odczytu nie istnieje


Tak zrób:
```cpp
std::vector<string> records;
...
vector<char> buffer(*it);
...
gzread(gzfp, &buffer.front(), buffer.size());
records.emplace_back(buffer.begin(), buffer.end());

1 użytkowników online, w tym zalogowanych: 0, gości: 1