Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Ошибка при записи файла Linux #20

Open
prospero78 opened this issue Oct 26, 2022 · 5 comments
Open

Ошибка при записи файла Linux #20

prospero78 opened this issue Oct 26, 2022 · 5 comments

Comments

@prospero78
Copy link
Contributor

PROCEDURE FileWrite():BOOLEAN;
	VAR
		strAdr: INTEGER;
		res: INTEGER;
		ind: INTEGER;
	BEGIN
		isErr:=FALSE;
		strToWrite:="Проверка текста";
		strAdr:=SYSTEM.ADR(strToWrite[0]);
		res:=File.Write(fileID, strAdr, SYSTEM.SIZE(WCHAR));
		IF res # 0 THEN
			Out.String("Main.FileWrite(): bad write file"); Out.Ln();
			isErr:=TRUE;
		END;
		RETURN isErr
	END FileWrite;

Что-то идёт не так. Даже одну литеру записать не могу.

@AntKrotov
Copy link
Owner

Функция File.Write возвращает количество байт, которые были записаны. Поэтому проверка

	IF res # 0 THEN
	(* ошибка записи *)
	END;

здесь будет неправильна.
Надо сравнить res не с нулем, а с размером данных, которые должны быть записаны.

@prospero78
Copy link
Contributor Author

prospero78 commented Oct 28, 2022

Антон, ну вот очень плохо, что нет вообще никаких в коде комментариев.
И реквесты ты толком не принимаешь.

З.Ы.
Подправил код, бесполезно. Я в печали.

@AntKrotov
Copy link
Owner

Не знаю, в чем может быть проблема. У меня такой код работает:

MODULE test;

IMPORT SYSTEM, File, Out;

VAR
	fileID: INTEGER;


PROCEDURE FileWrite(fileID: INTEGER):BOOLEAN;
	VAR
		strAdr: INTEGER;
		res: INTEGER;
		ind: INTEGER;
		dataSize: INTEGER;
		isErr: BOOLEAN;
		strToWrite: ARRAY 64 OF CHAR;
	BEGIN
		isErr:=FALSE;
		strToWrite:="Проверка текста";
		dataSize := LENGTH(strToWrite)*SYSTEM.SIZE(CHAR);
		strAdr:=SYSTEM.ADR(strToWrite[0]);
		res:=File.Write(fileID, strAdr, dataSize);
		IF res # dataSize THEN
			Out.String("Main.FileWrite(): bad write file"); Out.Ln();
			isErr:=TRUE;
		END;
		RETURN isErr
	END FileWrite;


BEGIN
	fileID := File.Create("/home/live/test.txt");
	IF FileWrite(fileID) THEN
	(* error *)
	END;
	File.Close(fileID)
END test.

Я только заменил ARRAY OF WCHAR на ARRAY OF CHAR и SYSTEM.SIZE(WCHAR) на SYSTEM.SIZE(CHAR), чтобы текст был записан в естественной для Linux кодировке UTF8 (иначе будет UCS-2) для удобного просмотра в простом редакторе. Ну и конечно следует подставить нормальное имя файла, вместо "/home/live/test.txt".

@prospero78
Copy link
Contributor Author

prospero78 commented Oct 28, 2022

Хм. Ок, посмотрю. На счёт WCHAR и CHAR -- важное замечание.
Если я правильно понял, то ошибки ОС не возвращаются. Опасненько.

@AntKrotov
Copy link
Owner

Модуль File - это просто обертка над libc. В основном, функции этого модуля возвращают то же, что и соответствующие функции libc.
Да, и напомню, что файл с исходным кодом тоже надо сохранять в UTF8 (и лучше с BOM).

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants