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; }