powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Ошибка при компилировании программы с physfs
23 сообщений из 23, страница 1 из 1
Ошибка при компилировании программы с physfs
    #38098487
xmarat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
По примеру написал небольшую программку:
Код: 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
Ошибка при компилировании программы с physfs
    #38098497
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xmaratЧто я делаю не так?
Не принимаешь во внимание регистрочувствительность идентификаторов.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Ошибка при компилировании программы с physfs
    #38098500
xmarat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вроде сделал как здесь написано http://icculus.org/physfs/physfstut.txt
А какие идентификаторы написаны не правильно?
...
Рейтинг: 0 / 0
Ошибка при компилировании программы с physfs
    #38098506
xmarat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Оказалось что нужно было написать вот так:
Код: plaintext
1.
PHYSFS_addToSearchPath("myzip.zip", 1);



Теперь все работает. Dimitry Sibiryakov спасибо Вам за помощь!
...
Рейтинг: 0 / 0
Ошибка при компилировании программы с physfs
    #38098513
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xmaratА какие идентификаторы написаны не правильно?
Э-э-э... тот, который написан в тексте ошибки, разумеется.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Ошибка при компилировании программы с physfs
    #38098711
xmarat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хочу дополнить вопрос. Нужно добавить в программу возможность записи/изменения файла в архиве, код получился следующий:
Код: 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
Ошибка при компилировании программы с physfs
    #38098712
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xmarat,

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

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


?
...
Рейтинг: 0 / 0
Ошибка при компилировании программы с physfs
    #38098715
xmarat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: 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
Ошибка при компилировании программы с physfs
    #38098717
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Ошибка при компилировании программы с physfs
    #38098718
xmarat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Точно. Забыл про эту функцию.

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

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



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

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



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


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

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

PHYSFS_setWriteDir("/write");
PHYSFS_mount("myzip.zip", "/write", 0);
PHYSFS_openWrite("/write/newfile.txt")
...
Рейтинг: 0 / 0
Ошибка при компилировании программы с physfs
    #38098872
xmarat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Попробовал так:
Код: 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
Ошибка при компилировании программы с physfs
    #38098874
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xmarat, zip файл вообще не приспособлен для модификации. Эта затея обречена на фейл с самого начала.
...
Рейтинг: 0 / 0
Ошибка при компилировании программы с physfs
    #38098969
xmarat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здесь можно архив распаковать, внести изменения, запаковать обратно. Сейчас задача свелась к вопросу: как запаковать файлы в архив?
...
Рейтинг: 0 / 0
Ошибка при компилировании программы с physfs
    #38099049
xmarat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Решил задачу переписав программу под 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
23 сообщений из 23, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Ошибка при компилировании программы с physfs
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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