2016-03-13 2 views
-3

У меня есть эта функция здесь, которая считывает файл в формате:входной файл читается с фантастическими персонажами

(badgeno) 
(name) 
(location) // until it hits * 
(birthday) 

Я добавил запись в текстовый файл, как это с помощью программы: Примечание: Я проверил файл после закрытия программы, и он был написан именно так, прежде чем я снова открою программу.

5432 
Janna Wind 
3321 Jupiter St 
44324, Fi, CA 
* 
1990 

Однако, когда я открываю программу и распечатать запись он показывает, как:

5432 
Janna Wind 
!34^&32()93321 Jupiter St 
44324, Fi, CA 
1990 

И когда я проверяю текстовый файл я сохранил его в после закрытия программы, казалось, это:

5432 
Janna Wind 
!34^&32()93321 Jupiter St 
44324, Fi, CA 
* 
1990 

Я предполагаю, что там должно быть что-то не так с моим «While (fgets ...» для размещения, но я не могу понять, почему Странные символы означает свои данные для чтения с адреса, который. Я не назначал o Что-то вроде этого? Извините, если я запутаюсь.

int readfile(struct test ** start, char filename[]){ 

FILE *fp = NULL; 
fp = fopen(filename,"r"); 

int badgeno; 
char fullname[45]; 
char location[100]; 
int birthday; 
char line[80]; 
int opened = 1; 

if (fp == NULL){ 

    opened = 1; 

} else { 

    opened = 0; 

    while (fscanf(fp, "%d\n", &badgeno) > 0) { 

     fgets(fullname, 45, fp); 

     strncpy(location, line, sizeof(line)); 

     while (fgets(line, 80, fp)) { 
      if (strcmp(line, "*\n") == 0) { 
       line[0] = '\0'; 
       break; 
      } 
      strncat(location, line, 79 - strlen(location)); 
     } 

     fscanf(fp, "%d[^\n]", &birthday); 

     addRecord(start, badgeno, fullname, location, birthday); 
    } 
} 

fclose(fp); 
return opened; 
} 

Я знаю, что мой код грязный, поэтому, пожалуйста, извините меня. Но да, что может привести к появлению этих странных персонажей, когда я снова открою программу. Возможно ли, что моя линия fgets - это проблема в коде?

+2

«Я знаю, что мой код грязный, поэтому, пожалуйста, извините меня». Вы знаете, что это грязно, потом исправить это, не извиняйтесь. –

+0

'fscanf (fp,"% d [^ \ n] ", & birthday);' → 'fscanf (fp,"% d ", & birthday);' –

ответ

2

Вот ваша проблема:

strncpy(location, line, sizeof(line)); 

С помощью этой линии Вы копируете из (неинициализированным!) Массив line в location. Поскольку line неинициализирован, его содержимое равно неопределенным и вы получите undefined поведение.

Вместо этого вы должны просто «очистить» массив location, чтобы его можно было добавить к нему позже в цикле. Это проще всего сделать при определении location массива:

char location[100] = { 0 }; 

Это установит все элементы location к нулю, что строка терминатор.

+0

Я так и думал! Должен ли я использовать другую функцию помимо этого? Моя цель состояла в том, чтобы фактически стереть массив, чтобы он не сохранял предыдущие данные. – Xirol

+0

СПАСИБО СМОТРЕТЬ! – Xirol

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