Итак, я работаю над программой на C, где я беру данные из файла и помещаю его в массив Structs... однако, никогда раньше не получая входные данные из файла на C, я немного запутался. Я пробовал несколько способов сделать это, и все они пришли к довольно похожему результату: первая переменная в порядке, вторая переменная в порядке (за исключением того, что копируется только половина имени), третья и четвертая переменные случайны тарабарщина. Насколько велика эта тарабарщина, зависит от того, как я пишу программу, но это всегда случайные символы.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct student {
int student_ID;
char name[26];
char degree[26];
char campus[26];
};
void main() {
FILE* fileToOpen = fopen("student database.txt", "r");
if (fileToOpen == NULL) {
printf("File cannot be opened!...\n...");
exit(0);
}
struct student studentList[12];
char buffer[200];
fgets(buffer, 200, fileToOpen);
int counter = 0;
int value;
while (!feof(fileToOpen)) {
value = sscanf(buffer, "%d,%s,%s,%s", &studentList[counter].student_ID, &studentList[counter].name, &studentList[counter].degree, &studentList[counter].campus);
printf("Read point: %d %s\n", studentList[counter].student_ID, studentList[counter].name);
fgets(buffer, 200, fileToOpen);
counter++;
}
printf("\n\n\n");
printf("First point: % d % s % s % s\n", studentList[0].student_ID, studentList[0].name, studentList[0].degree, studentList[0].campus);
printf("Second point: % d % s % s % s\n", studentList[1].student_ID, studentList[1].name, studentList[1].degree, studentList[1].campus);
printf("\nvalue: %d", value);
fclose(fileToOpen);
}
Я не понимаю, что здесь происходит. Я пробовал другие методы ввода (те, которые не включают этот буферный массив символов, fgets и т. д.), шаг за шагом следовал инструкциям, но операторы печати всегда показывали, что только часть данных вводится правильно, это первая переменная, и половина второй переменной (имя). Вы можете видеть это в последних двух операторах печати. В чем проблема?
Вот текстовый файл для справки:
895329,Tom Elder,Computer Science,Downtown Campus
564123,Elissa Honk,Interior Design,East Campus
963474,Alfonso Dobra,Civil Engineering,West Campus
127485,Paolo Morisa,Accounting,West Campus
330021,Lisa Bali,Accounting,Downtown Campus
844112,Eli Dovian,Computer Science,East Campus
745112,Rola Etrania,Civil Engineering,East Campus
541247,Pamela Dotti,Interior Design,East Campus
745930,Paul Sabrini,Accounting,Downtown Campus
500124,Gabriella Alma,Accounting,Downtown Campus
741206,Joe Damian,Computer Science,West Campus
963100,Perla Kino,Interior Design,East Campus
Спасибо за любую помощь и совет. Это пока вся программа.
Решение проблемы
Проверьте возвращаемое значение
fgets()
, а неfeof()
. Почему «в то время как (!feof (файл) )» всегда неправильно?. Избегайте магических чисел, таких как 200. Используйте размерbuffer
.// fgets(buffer, 200, fileToOpen);
// while (!feof(fileToOpen)) {
...
// fgets(buffer, 200, fileToOpen);
while (fgets(buffer, sizeof buffer, fileToOpen)) {Не пытайтесь использовать более 12
studentList[counter]
.
Протестируйте где- counter < 12
нибудь.
Для сканирования символов, кроме а
','
, не используйте"%s"
, используйте" %[^,]"
. Используйте ширину, чтобы предотвратить переполнение буфера."%s"
пропускает начальные пробелы, а затем сканирует все не пробелы. А','
не спец.// sscanf(buffer, "%d,%s,%s,%s"
sscanf(buffer, "%d, %19[^,], %19[^,], %19[^,\n]"Проверьте возвращаемое значение из
sscanf()
. Не используйтеstudentList[counter]
, если сканирование не было успешным.value = sscanf(buffer, "%d, %19[^,], %19[^,], %19[^,\n]"...
if (value!= 4) {
puts("Failed to scan <%s>\n", buffer);
} else {
; // use studentList[counter]
}
Комментариев нет:
Отправить комментарий