ありそうでなかった高速行読み込み

char* my_fgets(FILE* fp)
{
	char* result = static_cast<char*>(malloc(1));
	result[0] = '\0';
	size_t sz = 0;
	const int AppopriateChunkSize = 16;
	char s[AppopriateChunkSize + 1];
	while (!0)
	{
		if (!fgets(s, AppopriateChunkSize, fp))
		{
			result = nullptr;
			break;
		}
		sz += strlen(s);
		result = static_cast<char*>(realloc(result, sz + 1));
		strcat_s(result, sz + 1, s);
		if (s[strlen(s) - 1] == '\n')
			break;
	}
	return result;
}

template< class FUNC >
bool my_fgets(FILE* fp, FUNC func)
{
	char* buf = static_cast<char*>(malloc(1));
	buf[0] = '\0';
	size_t sz = 0;
	const int chunk_size = 16;
	char s[chunk_size];
	bool result;
	while (!0)
	{
		if (!fgets(s, chunk_size, fp))
		{
			result = false;
			break;
		}
		int slen = strlen(s);
		sz += slen;
		buf = static_cast<char*>(realloc(buf, sz + 1));
		strcat_s(buf, sz + 1, s);
		if (s[slen - 1] == '\n')
		{
			func(buf);
			result = true;
			break;
		}
	}
	free(buf);
	return result;
}