// program to use file stream functions #include <stdio.h> #include <stdlib.h> #include <string.h> int parse_args(int argc, char * argv[]); void check_for_null(void *p, char *msg); char * filename = NULL; char * newFilename = NULL; int seek_pos = -1; int main(int argc, char *argv[]) { parse_args(argc, argv); FILE * fOut = NULL; // open file FILE * fIn = fopen(filename, "r"); check_for_null(fIn, "Unable to open fIn file."); // if seek_pos set, seek to that position if (seek_pos > 0) { int retVal = fseek(fIn, seek_pos, SEEK_SET); if (retVal != 0) fprintf(stderr, "Error with fseek.\n"); } // print out 10 bytes starting from seek_pos char s[10]; int num_read = -1; num_read = fread(s, sizeof(char), 10, fIn); if (num_read > 0) printf("%*s\n", num_read, s); else fprintf(stderr, "return value from fread: %d\n", num_read); // if copy specified, open new file, copy fIn if (newFilename != NULL) { fOut = fopen(newFilename, "w"); check_for_null(fOut, "Unable to open fOut file."); // seek to begin of fIn int retVal = fseek(fIn, 0, SEEK_SET); if (retVal != 0) fprintf(stderr, "Error with fseek.\n"); // read fIn, 10 bytes at a time while ((num_read = fread(s, sizeof(char), 10, fIn)) > 0) { fwrite(s, sizeof(char), num_read, fOut); } fclose(fOut); } // close files fclose(fIn); // note - with open file can also use fscanf, fprintf, etc. /*char s[100]; fscanf(fIn, "%99s", s); printf("%s\n", s);*/ return 0; } int parse_args(int argc, char * argv[]) { if (argc < 2) { printf("Usage: ./files filename.txt [-copy newfilename.txt] [-seek int_position] [-stats which]\n"); printf(" If -copy specified, copy entire file.\n" " If -seek specified, seek to that location before printing 10 bytes.\n"); exit(0); } filename = argv[1]; for(int i=2; i < argc; i++) { if (strcmp(argv[i], "-copy") == 0 && argc > i) newFilename = argv[i+1]; if (strcmp(argv[i], "-seek") == 0 && argc > i) seek_pos = atoi(argv[i+1]); } } void check_for_null(void *p, char *msg) { if (p == NULL) { fprintf(stderr, "NULL result, bad, %s\n", msg); exit(0); } }