2016-01-10 6 views
0

Я пишу код, используя структуры, которые будут читать текстовый файл с данными о книге. Название, автор, издатель, жанр т.д. ...Что это значит: '=': левый операнд должен быть l-значением?

мой файл заголовка выглядит следующим образом:

typedef struct book{  

    char name[NAME_LENGTH]; 
    char authors[AUTHORS_NAME_LENGTH]; 
    char publisher[PUBLISHER_NAME_LENGTH]; 
    char genre[GENRE_LENGTH]; 
    int year; 
    int num_pages; 
    int copies; 
}book; 


typedef struct library 
{  

    book books[BOOK_NUM]; 

}library; 

typedef char* string; 

код:

if (NULL == (incoming_books = fopen(".\books.txt", "r"))) 
    {   /* opening file for reading */ 
     /*printf("Error opening file"); write to file*/ 
     exit(1); 
    } 
    while (!feof(incoming_books)) 
    { 
     fgets(line,200,incoming_books);//copies one line, assuming no longer than 200 chars 

     idx_helper = strchr(line, '$');//finds '$' index, attribures are seperated by "$$$" 
     index = (int)(idx_helper - line);// cast index into int 
     char_num = index; 
     if (NULL != memcpy(temp_string, line, char_num))//copies string (name) 
      temp_book->name = *temp_string; 

     index += 3;       // incrementing index by 3 
     idx_helper = strchr(&line[index], '$'); // same for authors 
     index = (int)(idx_helper - &line[index]); 
     char_num = index; 
     if (NULL != memcpy(temp_string, &line[index], char_num*sizeof(char))) 
     temp_book->authors = *temp_string; 
    } 

и так далее для каждой книги атрибута

Я получаю две ошибки: 1. Ошибка 7 ошибки C2106: '=': левый операнд должен быть l-значением , который указывает на строки temp_book-> name = * temp_string; и temp_book-> authors = * temp_string; 2. IntelliSense: выражение должно быть модифицируемым значением , которое указывает на одинаковые строки.

может быть проблемой указателя?

+0

Совет: использовать условия йоды, естественно, не найдет его читателями. –

ответ

1

Поскольку массивы не подлежат модификации lvalue s.

Отрывок из C11 Standard Draft N1570 — (смелые сегменты были выделены в этом ответе, чтобы помочь читателю найти интересную часть).

6.3.2.1 Lvalues, массивы и функции десигнаторами

  1. именующее является выражением (с типом объекта, кроме void), которые потенциально обозначает объект; 64), если lvalue не определяет объект при его оценке, поведение не определено. Когда объект имеет определенный тип, тип определяется lvalue, используемым для обозначения объекта. модифицируемого именующего является именующего, который не имеет типа массива, не имеет неполный типа, не имеет константную квалификацию типа, и если он является структурой или объединения, не имеет никакого элемента (включая, рекурсивно, любой член или элемент всех содержащихся агрегатов или союзов) с категориальным типом.

64) Название «» именующее «» приходит первоначально из выражения присваивания E1 = E2, в которой левый операнд Е1 требуется, чтобы быть (модифицируемые) именующее , Это, пожалуй, лучше считается представляющим значение «локатор» . То, что иногда называют «rvalue», в этом Международном стандарте описывается как «значение выражения».

используется memcpy() для копирования в temp_string, вы должны использовать его, чтобы скопировать в массив непосредственно вместо.Кроме того, не используйте sizeof(char), поскольку он никогда не будет ничего, кроме и всегда выделяйте место для терминатора nul и скопируйте терминатор nul. В противном случае, когда вы передаете массив функции, которая ожидает строку , как различные функции str * или printf() с опцией "%s"не определено поведение.

Aditionally, в вашем коде есть это

while (!feof(incoming_books)) 

это будет только правда когда fgets() потерпит неудачу, то это произойдет после того, как в первый раз fgets() не удалось, и, как вы никогда не проверить, что последняя строка будет повторите это, вы должны сделать это

while (fgets(line, 200, incoming_books) != NULL) 
+0

О, конечно, массивы не назначаются - но связь с lvalues ​​более сложна, как вы теперь включили в ответ. Это сделает хорошую точку отсчета в будущем :-) –

+1

Я думаю, что GCC правильно говорит: http://melpon.org/wandbox/permlink/FV6kDIyHbb0kOgwv или https://ideone.com/WoBswo. Я думаю, что OP использует MSVC. –

Смежные вопросы