Я читаю файл CSV, используя fscanf, который имеет два поля.
datatype_t*read(FILE* fp)
{
char name[66];
char data[1466];
if (fscanf(fp, "%[^,] %[^\n]", name, data) == 2) {
datatype_t *d = (datatype_t*)malloc(sizeof(datatype_t));
d->name = strdup(name);
d->data = strdup(data);
return d;
}
return NULL;
}
Данные файла CSV выглядят следующим образом:
Мистер Дэйв, школьный учитель
Майк, руководитель
Сачин, сотрудник
Теперь я читаю другой текстовый файл, в котором есть данные.
char buffer[66];
if (fgets(buffer,sizeof buffer, fp) != NULL ) {
keydata_t *k = (keydata_t*)malloc(sizeof(keydata_t));
size_t len = strlen(buffer);
if(buffer > 0 && buffer[len-1] == '\n'){
buffer[--len] = '\0';
}
k->name = strdup(buffer);
return k;
}
return NULL;
}
Данные txt файла выглядят так.
Мистер Дэйв
Рон
Мистер Тим
Теперь, когда я сравниваю строки данных:
new_ptr = root;
while((keyt = read_key(keyfile))!= NULL){
printf("%s\n", keyt->name);
printf("%s\n", root->key);
if(strcmp(keyt->name, root->key) == 0){
printf("match\n");
}
else if(strcmp(keyt->name, root->key) > 0){
printf("not equal\n");
}
else if (strcmp(keyt->name, root->key) < 0){
printf("not equal\n");
}
new_ptr = search(new_ptr, keyt);
}
Он продолжает печатать
не равно
даже для мистера Дейва, где должно быть совпадение. Я не могу понять проблему с двумя.
if (fscanf(fp, "%[^,] %[^\n]", name, data) == 2) {
будет включать команду,
в качестве первого символа второго параметра. предложить:if (fscanf(fp, "%[^,] %c %[^\n]", name, data) == 2) {
- person user3629249   schedule 15.09.2016void*
, который может быть назначен любому другому указателю. приведение возвращаемого типа просто загромождает код и затрудняет его понимание, отладку и поддержку. Предложите снять гипс. Всегда проверяйте (!=NULL) возвращаемое значение перед его использованием, чтобы убедиться, что операция прошла успешно. - person user3629249   schedule 15.09.2016d
бессмысленно, даже в текущем опубликованном коде. - person user3629249   schedule 15.09.2016if(buffer > 0 && buffer[len-1] == '\n'){
выражениеbuffer > 0
ВСЕГДА будет истинным, потому что в C ссылка на имя массива ухудшается до адреса первого байта массива. Возможно, вы имели в виду:if( len > 0 && buffer[len-1] == '\n'){
- person user3629249   schedule 15.09.2016