What's in a name?
Имя обычно мыслится как содержащие буквы, может быть, пробелы и некоторые другие символы. Код должен быть указан, что char
составляют имя, какие действительные разделители и обрабатывают другие неожиданно char
.
"%s"
отличается только пробелом и небелым пространством. Он обрабатывает ,
так же, как буквы.
"%width[A-Za-z' ]"
определит scanset Принимая буквы, '
и пробел. Он будет читать/сохранять до width
символов перед добавлением нулевого символа .
Всегда полезно проверить возвращаемое значение функции ввода до с использованием населенных объектов.
FILE *fp = fopen("1.txt", "rt");
if (fp == NULL) Handle_Error();
// end-of-file signal is not raised until after a read attempt.
// while (!feof(fp)) {
char name_in[100];
char delimiter[2];
int count;
while ((count = fscanf(fp, "%99[A-Za-z' ]%1[,\n]", name_in, delimiter)) == 2) {
printf("<%s>%s", name_in, delimiter);
addnewnode(head, name_in);
if (delimiter[0] == '\n') {
; // Maybe do something special at end-of-line
}
}
fclose(fp);
// Loop stopped unexpectedly
if (count != EOF || !feof(fp)) {
puts("Oops");
}
Более надежный код будет читать линию как с fgets()
, а затем обработать строку. Может использовать подобный код, как описано выше, но с sscanf()
Чтобы включить -
в так набор сканируемых символов кода может обрабатывать дефис имена, список его первым.Возможно, вы захотите разрешить использование других символов.
"%width[-A-Za-z' .]"
что-то вроде [это] (http://stackoverflow.com/questions/12911299/read-csv-file-in-c)? – Zorgatone
Возможный дубликат [В C, как я должен читать текстовый файл и печатать все строки] (http://stackoverflow.com/questions/3463426/in-c-how-should-i-read-a-text-file -and-print-all-strings) –