#include #include #include int main(int argc, char *argv[]) { if (argc < 2) { fprintf(stderr, "Need a file name as first argument!\n"); return EXIT_FAILURE; } FILE *file = fopen(argv[1], "rb"); if (file == NULL) { fprintf(stderr, "File open failed!\n"); return EXIT_FAILURE; } size_t buffer_size = 8; char *line = (char*)malloc(buffer_size); char *longest = (char*)malloc(buffer_size); size_t longest_on = 0; size_t longest_length = 0; size_t num_lines = 0; if (line == NULL || longest == NULL) { fprintf(stderr, "Memory allocation failed!\n"); return EXIT_FAILURE; } long pos_before = ftell(file); for (num_lines = 1 ; fgets(line, buffer_size, file) ; ++num_lines) { long pos_after = ftell(file); size_t line_length = pos_after - pos_before - 1; pos_before = pos_after-1; while (line_length == buffer_size-1 && line[line_length-1] != '\n') { line = (char*)realloc(line, buffer_size*2); longest = (char*)realloc(longest, buffer_size*2); if (line == NULL || longest == NULL) { fprintf(stderr, "Memory allocation failed!\n"); return EXIT_FAILURE; } if (fgets(&line[buffer_size-1], buffer_size+1, file) == NULL) { fprintf(stderr, "File read failed!\n"); fclose(file); free(line); free(longest); return EXIT_FAILURE; } pos_after = ftell(file); line_length += pos_after - pos_before - 1; pos_before = pos_after-1; buffer_size *= 2; } if (line_length > longest_length) { char *tmp = longest; longest = line; line = tmp; longest_on = num_lines; longest_length = line_length; } } if (longest_on) { printf("File had total of %lu lines.\n", num_lines); printf("Longest line found on line %lu with %lu characters.\n", longest_on, longest_length); printf("The line was: "); fwrite(longest, 1, longest_length, stdout); } else { fprintf(stderr, "The file had no readable lines!\n"); } fclose(file); free(line); free(longest); return EXIT_SUCCESS; }