home *** CD-ROM | disk | FTP | other *** search
/ NetNews Usenet Archive 1992 #16 / NN_1992_16.iso / spool / comp / lang / c / 11633 < prev    next >
Encoding:
Internet Message Format  |  1992-07-27  |  3.1 KB

  1. Path: sparky!uunet!mcsun!uknet!ieunet!nixeid!bsullivn
  2. From: bsullivn@nixeidsc.sni.ie (Bryan O'Sullivan)
  3. Newsgroups: comp.lang.c
  4. Subject: Re: While problem
  5. Message-ID: <131@nixeidsc.sni.ie>
  6. Date: 27 Jul 92 09:45:11 GMT
  7. References: <92204.160015GNR100@psuvm.psu.edu>
  8. Reply-To: bryan@sc.sni.ie
  9. Organization: Siemens-Nixdorf Software Development Centre, Dublin
  10. Lines: 65
  11. X-Newsreader: Tin 1.1 PL3
  12.  
  13.  
  14.  
  15. GNR100@psuvm.psu.edu writes:
  16. :    I'm having trouble with a whil loop in function I am writing to
  17. : read a line from a fileby puttingeach character into an array, accesed by
  18. : pionters, until the '\n' character is reached of EOF is reached.
  19. :   Trouble is, I keep getting an error message that the function needs an
  20. : Lvalue (address) inside the while loop.  Any ideas as to the problem?
  21. : The filename is a global variable, and that's why it isn't declared.
  22.  
  23. Well, first off, your call to getc will bomb if you ever get the rest of
  24. the program running.  Getc(3) takes a FILE pointer, not a file name, as
  25. argument.  Also, (no flame intended) you're making the classic new C
  26. programmer mistake of trying to do too many "neat" things inside your
  27. while loop, which is part of the reason why it isn't working.
  28.  
  29. : char readline(char *string[])
  30. : {
  31. :   int i=0;
  32. :   while(((*string+i++=(char)getc(fname))!=EOF)
  33. :       &&((*string+i++=(char)getc(fname))!='\n'));
  34. :   return (*string+(i-1));
  35. : }
  36.  
  37. char readline(char string[])
  38. {
  39.     int i;
  40.  
  41.     for (i = 0; (string[i] = getc(fp)) != EOF; i++) {
  42.         if (string[i] == '\n') {
  43.             break;
  44.         }
  45.     }
  46.     return &string[i-1];
  47. }
  48.  
  49. That is probably what you really want to be doing.  You're making a
  50. number of other errors in your own code; you're not dereferencing string
  51. properly (you have it declared as a vector of strings, not as a single
  52. string) -- this is the cause of your lvalue problem.  If you got this to
  53. work, you would still have other griefs to contend with.  Your
  54. comparisons in the while statement compare consecutive characters with
  55. EOF and EOL, so you could miss an EOF when checking for an EOL with your
  56. present code, and vice versa.  It's not necessary to have those casts
  57. with getc() either; they just make your code unclear.  Furthermore, the
  58. ugly pointer arithmetic you're doing is no longer really necessary;
  59. there was a time when compilers were bad at optimising array arithmetic,
  60. but most such compilers are (thankfully) no longer with us.
  61.  
  62. Finally, I prefer the use of a for statement for the kind of job you're
  63. trying to do; it's just a stylistic issue, but it makles the code more
  64. clear.  And finally finally, doing the return statement as I have done
  65. is also somewhat more clear, and won't cost anything if you have a
  66. half-decent compiler.
  67.  
  68. My advice to you: read the sections on pointers in your C manual *very*
  69. carefully again.  Good luck.
  70.  
  71.     -- Bryan
  72.  
  73. -- 
  74. Bryan O'Sullivan                                             +353-1-767551 x225
  75. Siemens-Nixdorf Informationssysteme AG                          bryan@sc.sni.ie
  76. Software Development Centre                    "Theory like mist on eyeglasses.
  77. Dublin                                          Obscure facts." -- Charlie Chan
  78.