Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Ошибка при компилировании программы с physfs / 23 сообщений из 23, страница 1 из 1
01.01.2013, 23:12
    #38098487
xmarat
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка при компилировании программы с physfs
По примеру написал небольшую программку:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
#include <stdio.h>
#include <string.h>
#include <physfs.h>

int main(int argc, const char** argv)
{
	PHYSFS_init(argv[0]);
	PHYSFS_AddToSearchPath("myzip.zip", 1);
	int do_you_exist = PHYSFS_exists("myfile.txt");
	if (do_you_exist == 0) puts(PHYSFS_getLastError());
	PHYSFS_File * myfile = PHYSFS_openRead("myfile.txt");
	char * myBuf = new char[PHYSFS_fileLength(myfile)];
	int length_read = PHYSFS_read (myfile, myBuf, 1, PHYSFS_fileLength(myfile));
	PHYSFS_close(myfile);
	PHYSFS_deinit();
}



Компилирую так:
Код: plaintext
1.
g++ ph.cpp -o ph -lphysfs

Выдает всего одну ошибку:
Код: plaintext
1.
ph.cpp:8:39: ошибка: нет декларации «PHYSFS_AddToSearchPath» в этой области видимости

Система Ubuntu Linux, libphysfs1 и libphysfs-dev установлены. Что я делаю не так? Заранее благодарен...
...
Рейтинг: 0 / 0
01.01.2013, 23:26
    #38098497
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка при компилировании программы с physfs
xmaratЧто я делаю не так?
Не принимаешь во внимание регистрочувствительность идентификаторов.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
01.01.2013, 23:30
    #38098500
xmarat
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка при компилировании программы с physfs
Вроде сделал как здесь написано http://icculus.org/physfs/physfstut.txt
А какие идентификаторы написаны не правильно?
...
Рейтинг: 0 / 0
01.01.2013, 23:41
    #38098506
xmarat
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка при компилировании программы с physfs
Оказалось что нужно было написать вот так:
Код: plaintext
1.
PHYSFS_addToSearchPath("myzip.zip", 1);



Теперь все работает. Dimitry Sibiryakov спасибо Вам за помощь!
...
Рейтинг: 0 / 0
01.01.2013, 23:57
    #38098513
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка при компилировании программы с physfs
xmaratА какие идентификаторы написаны не правильно?
Э-э-э... тот, который написан в тексте ошибки, разумеется.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
02.01.2013, 15:24
    #38098711
xmarat
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка при компилировании программы с physfs
Хочу дополнить вопрос. Нужно добавить в программу возможность записи/изменения файла в архиве, код получился следующий:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
#include <iostream>
#include <stdio.h>
#include <string.h>
#include "physfs.h"

using namespace std;

int main(int argc, char** argv)
{
	char * myBuf;
	PHYSFS_File * myfile;

	// Инициализируем PHYSFS и подключаем архив
	PHYSFS_init(argv[0]);
	PHYSFS_addToSearchPath("myzip.zip", 1);

	// Проверяем существование файла
	int do_you_exist = PHYSFS_exists("myfile.txt");
	if (do_you_exist == 0) puts(PHYSFS_getLastError());

	// Открываем файл для чтения
	myfile = PHYSFS_openRead("myfile.txt");
	if (!myfile)
	{
		cout << "Could not open file" << endl;
	}
	else
	{
		myBuf = new char[PHYSFS_fileLength(myfile)];
		int length_read = PHYSFS_read(myfile, myBuf, 1, PHYSFS_fileLength(myfile));
		cout << myBuf << endl;
		PHYSFS_close(myfile);
		sprintf( myBuf, "%s%s", myBuf, "!!!" );
	}

	// Открываем файл для записи
	myfile = PHYSFS_openWrite("myfile.txt");
	if (!myfile)
	{
		cout << "Could not open file" << endl;
	}
	else
	{
		PHYSFS_write(myfile, myBuf, strlen(myBuf), 1);
		PHYSFS_close(myfile);
	}

	// Завершаем работу PHYSFS
	PHYSFS_deinit();
}



Чтение при этом проходит нормально, а вот на открытии файла для записи проблема, соответственно выдает "Could not open file", т.е. функция PHYSFS_openWrite("myfile.txt") вернула NULL. В чем может быть проблема?
...
Рейтинг: 0 / 0
02.01.2013, 15:27
    #38098712
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка при компилировании программы с physfs
xmarat,

что у тебя показывает

Код: plaintext
1.
unzip -l myzip.zip


?
...
Рейтинг: 0 / 0
02.01.2013, 15:35
    #38098715
xmarat
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка при компилировании программы с physfs
Код: plaintext
1.
2.
3.
4.
5.
6.
Archive:  myzip.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
        7  2013-01-01 23:38   myfile.txt
---------                     -------
        7                     1 file
...
Рейтинг: 0 / 0
02.01.2013, 15:41
    #38098717
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка при компилировании программы с physfs
xmarat,

http://192.121.234.229/manualer/programering/Tao-doc/Tao.PhysFs/Tao.PhysFs.Fs.PHYSFS_openWrite.html Return Value

A valid PhysicsFS filehandle on success, NULL on error. Specifics of the error can be gleaned from PHYSFS_getLastError.
...
Рейтинг: 0 / 0
02.01.2013, 15:48
    #38098718
xmarat
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка при компилировании программы с physfs
Точно. Забыл про эту функцию.

Выдал:
Код: plaintext
1.
Write directory is not set

Добавил следующее:
Код: plaintext
1.
PHYSFS_setWriteDir("/");



Выдал:
Код: plaintext
1.
Permission denied

Думаю нужно как то определить, где PHYSFS хранит временную папку.
...
Рейтинг: 0 / 0
02.01.2013, 16:18
    #38098731
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка при компилировании программы с physfs
xmaratгде PHYSFS хранит временную папку.
Разве не в /tmp ?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
02.01.2013, 16:24
    #38098737
xmarat
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка при компилировании программы с physfs
Похоже что нет. Разбираюсь.
...
Рейтинг: 0 / 0
02.01.2013, 16:34
    #38098750
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка при компилировании программы с physfs
xmaratПохоже что нет.
А что мешает тебе установить /tmp в качестве WriteDir? Ты попытался поставить корень и
естественно обломался, поскольку вряд ли у тебя есть права на запись туда.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
02.01.2013, 16:38
    #38098754
xmarat
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка при компилировании программы с physfs
Если поставить так:
Код: plaintext
1.
PHYSFS_setWriteDir("/tmp");



То программа просто в папке tmp создаст файл myfile.txt и все. А нужно изменить файл в архиве.
...
Рейтинг: 0 / 0
02.01.2013, 16:48
    #38098765
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка при компилировании программы с physfs
xmaratА нужно изменить файл в архиве.
А разве для этого его не надо сначала извлечь, потом изменить, а потом упаковать на место
старого?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
02.01.2013, 17:06
    #38098785
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка при компилировании программы с physfs
Похоже что это R/O библиотека. Возможно упаковка ресурсов (zip,pak,wad) происходит 1 раз
при сборке проекта а директория для записи - на локальной файловой системе для конфигов
и save- сохранялок игры. Читая маны по physfs непонятно. нигде про это открытым текстом не пишут.
Возможно я и ошибаюсь.
...
Рейтинг: 0 / 0
02.01.2013, 18:37
    #38098843
xmarat
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка при компилировании программы с physfs
Dimitry Sibiryakovсначала извлечь, потом изменить, а потом упаковать на место
старого


Да, но как упаковать на место старого? :)
...
Рейтинг: 0 / 0
02.01.2013, 19:07
    #38098858
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка при компилировании программы с physfs
xmarat, если тебя пугает сам процесс то можно это как-то автоматизировать ant-ом
или другими bash-скриптами.
...
Рейтинг: 0 / 0
02.01.2013, 19:16
    #38098860
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка при компилировании программы с physfs
xmarat,

Давно я с этой библиотекой не работал, но кажется должно cработать следующее:

PHYSFS_setWriteDir("/write");
PHYSFS_mount("myzip.zip", "/write", 0);
PHYSFS_openWrite("/write/newfile.txt")
...
Рейтинг: 0 / 0
02.01.2013, 19:42
    #38098872
xmarat
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка при компилировании программы с physfs
Попробовал так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
#include <iostream>
#include <stdio.h>
#include <string.h>
#include "physfs.h"

using namespace std;

int main(int argc, char** argv)
{
	char * myBuf;
	PHYSFS_File * myfile;

	// Инициализируем PHYSFS и подключаем архив
	PHYSFS_init(argv[0]);
	PHYSFS_addToSearchPath("myzip.zip", 1);

	// Проверяем существование файла
	int do_you_exist = PHYSFS_exists("myfile.txt");
	if (do_you_exist == 0) puts(PHYSFS_getLastError());

	// Открываем файл для чтения
	myfile = PHYSFS_openRead("myfile.txt");
	if (!myfile)
	{
		cout << "Could not open file" << endl;
		puts(PHYSFS_getLastError());
	}
	else
	{
		myBuf = new char[PHYSFS_fileLength(myfile)];
		int length_read = PHYSFS_read(myfile, myBuf, 1, PHYSFS_fileLength(myfile));
		cout << myBuf << endl;
		PHYSFS_close(myfile);
		sprintf( myBuf, "%s%s", myBuf, "!!!" );
	}

	PHYSFS_setWriteDir(".");
	PHYSFS_mkdir("write");
	PHYSFS_setWriteDir("write");
	PHYSFS_mount("myzip.zip", "write", 0);

	// Открываем файл для записи
	myfile = PHYSFS_openWrite("myfile.txt");
	if (!myfile)
	{
		cout << "Could not open file" << endl;
		puts(PHYSFS_getLastError());
	}
	else
	{
		PHYSFS_write(myfile, myBuf, 1, strlen(myBuf));
		//sleep(5);
		PHYSFS_close(myfile);
	}

	// Завершаем работу PHYSFS
	PHYSFS_deinit();
}



Не сработало. Папка с файлом создается, но архив остается без изменения.
...
Рейтинг: 0 / 0
02.01.2013, 19:51
    #38098874
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка при компилировании программы с physfs
xmarat, zip файл вообще не приспособлен для модификации. Эта затея обречена на фейл с самого начала.
...
Рейтинг: 0 / 0
02.01.2013, 23:26
    #38098969
xmarat
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка при компилировании программы с physfs
Здесь можно архив распаковать, внести изменения, запаковать обратно. Сейчас задача свелась к вопросу: как запаковать файлы в архив?
...
Рейтинг: 0 / 0
03.01.2013, 02:53
    #38099049
xmarat
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка при компилировании программы с physfs
Решил задачу переписав программу под libzip. Всем спасибо за ответы! Выкладываю код, возможно кому то пригодится:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
// Компилируем так: g++ main.cpp -o main -lzip

#include <iostream>
#include <zip.h>

using namespace std;

int main()
{
	string filename = "myfile.txt";
	string txt;

	// Открываем zip архив
	int err = 0;
	zip *z = zip_open("myzip.zip", 0, &err);
	zip_source * s;

	// Определяем существование файла
	int finded = -1;
	for (int i = 0; i<zip_get_num_files(z); i++) {
		if (zip_get_name(z, i, 0) == filename) finded = i;
	}

	// Если существует
	if (finded != -1)
	{
		// Узнаем размер файла
		struct zip_stat st;
		zip_stat_init(&st);
		zip_stat_index(z, finded, 0, &st);

		char *contents = new char[st.size];

		// Считываем файл
		zip_file *f = zip_fopen_index(z, finded, 0);
		zip_fread(f, contents, st.size);
		zip_fclose(f);

		// Добавляем к тексту файла дополнительный текст
		txt = string(contents, st.size) + " + добавленный текст";

		// В буффере создаем новый файл
		s = zip_source_buffer(z, txt.c_str(), txt.size(), 0);

		// Заменяем старый файл новым
		zip_replace(z, finded, s);
	}
	else // Если не существует
	{
		// Задаем текст
		txt = "текст";

		// В буффере создаем новый файл
		s = zip_source_buffer(z, txt.c_str(), txt.size(), 0);

		// Добавляем новый файл в архив
		zip_add(z, filename.c_str(), s);
	}


	// Закрывем архив
	zip_close(z);
}
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Ошибка при компилировании программы с physfs / 23 сообщений из 23, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]