Path: utzoo!utgpu!water!watmath!clyde!rutgers!rochester!bbn!uwmcsd1!ig!agate!ucbvax!ulysses!cjc From: cjc@ulysses.homer.nj.att.com (Chris Calabrese[rs]) Newsgroups: comp.lang.c Subject: Re: FILE I/O & SLOW WINDOWS Summary: No, No, No Message-ID: <10022@ulysses.homer.nj.att.com> Date: 8 Feb 88 16:24:57 GMT References: <11678@brl-adm.ARPA> Organization: AT&T Bell Laboratories, Murray Hill Lines: 74 In article <11678@brl-adm.ARPA>, VC008329%NDSUVM1.BITNET@cunyvm.cuny.EDU writes: > > I have been using Turbo C for anly a few months now and I'm having a couple > of problems with a program I'm writing. > > > SAVE TO FILE RETRIEVE FROM FILE > file = fopen("main","w"); file = fopen("main","r"); > fputs(title,file); fgets(title,sizeof(title),file); > fprintf(file,'n'); fprintf(file,'n'); > fputs(password,file); fgets(password,sizeof(password),file); > fprintf(file,'n'); fprintf(file,'n'); > fputs(selpass,file); fgets(selpass,sizeof(selpass),file); > fclose(file); fclose(file); No, No, No, this is all wrong. First off, the 'n's are ridiculous. How about a newline between variables? Makes a lot more sense, since this is the delimiter which fgets uses. The next problem is that, if title is an array, the sizeof(title) part of the code will cause the number of characters to be read in as had been allocated for (or until a newline), but the fputs(title,file) part will only write as many characters as come before a '\0' char. The sizeof code should be avoided for another reason, which is that title may be a pointer to an array of characters, in which case sizeof will return the number of bytes in a pointer. Finally, when using fgets, don't forget to strip the possible \n char on the end. The correct code is: SAVE TO FILE char title[SIZE]; file = fopen("main","w"); fputs(title,file); fputc('\n', file); fputs(password,file); fputc('\n', file); fputs(selpass,file); fputc('\n', file); fclose(file); Retrieve int tmp; file = fopen("main","r"); fgets(title, SIZE, file); tmp = strlen(title) -1; title[tmp] = title[tmp] == '\n' ? '\0' : title[tmp]; fgets(password, SIZE, file); tmp = strlen(password) -1; password[tmp] = password[tmp] == '\n' ? '\0' : password[tmp]; fgets(sellpass, SIZE, file); tmp = strlen(sellpass) -1; sellpass[tmp] = sellpass[tmp] == '\n' ? '\0' : sellpass[tmp]; fclose(file); If you don't want to use \n for field seperation, use fscanf to parse the input line for a field seperator char, or use fixed length fields with read and write system calls. Chris Calabrese AT&T Bell Labs ulysses!cjc