Безопасное чтение строк неизвестной длины

Я пытаюсь безопасно получить строки неизвестной длины с помощью fgets

Это код, который я смог придумать до сих пор, но теперь я застрял в том, как продолжить работу.

#include <stdio.h>
#include <stdlib.h> 
#include <string.h> 
#include <assert.h> 

#define DEFLEN 4 
#define CHUNKSZ 2 


int i = 0;
int size =0;
int size2 =0;
char* ln1;
char* ln2;
FILE *fpin;
char *getStrFromFile( FILE *fpins  )/*file stream to read string from */
 {

 DEFLEN = malloc( CHUNKSZ *sizeof(int));
 while(1){
  if( fgets(ln1+size2, DEFLEN, fpin) == NULL) {
    if(size > 0){
     return (ln1);
    }
    else {
      return (NULL);
      free(ln1);
    }
  }
 else{
   size2=strlen(ln1);
   if(ln1[size2 -1] == '\n'){
     return (ln1);
   }
    else{
     ln2=malloc(size+CHUNKSZ * sizeof(char));
     assert(ln2);
     strcpy(ln2, ln1);
     free (ln1);
     ln1 = ln2;
     return (ln1);
    }
   }
}

Я также получаю сообщение об ошибке для строки DEFLEN = malloc

ошибка: lvalue требуется как левый операнд присваивания


person Luigirockz    schedule 22.10.2013    source источник
comment
Вы хотите реализовать readline?   -  person lordkain    schedule 22.10.2013
comment
Я бы больше беспокоился о компиляции кода, а не о том, работает он или нет. Вы присваиваете адрес целочисленной константе. А у вас несоответствие размеров. Ваш начальный размер – CHUNKSZ * sizeof(int), а последующие – CHUNKSZ * sizeof(char). Вероятно, вам нужно исправить это вместе с множеством других ошибок. Наконец, ни одна переменная здесь не должна быть глобальной; нет.   -  person WhozCraig    schedule 22.10.2013


Ответы (2)


DEFINE в вашем коде используется прекомпилятором. Таким образом, вы не можете ничего присвоить определению!

Эта линия

DEFLEN = malloc( CHUNKSZ *sizeof(int));

заменяется

4 = malloc( CHUNKSZ *sizeof(int));
person lordkain    schedule 22.10.2013

Вы не можете переназначить DEFLEN. Это заполнитель, который заменяется перед компиляцией, и его существование за пределами замененного значения исчезает во время выполнения.

person alex    schedule 22.10.2013