я хочу прочитать каждую строку из файла, который выглядит примерно так:
readEveryLine
{
"Bart [m]" -> "Marge [f]";
"Lisa [f]" -> "Homer [m]";
...
}
я хочу использовать:
- fgets() для чтения файла построчно
- strncmp(), чтобы сравнить каждую строку с заданной строкой или убедиться, что она имеет правильный формат.
что я имею:
while(fgets(*file_string, MAX_INPUT_STDIN, file) != NULL)
{
changeLastC(*file_string); // function to change \n into \0
if (strncmp(*file_string, "readEveryLine\0", 14) == 0)
{
if (strncmp(*file_string, "{\0", 2) == 0)
{
// check the first -> relation
}
}
else
{
printf("Error Parsing\n");
}
}
так что проблема в том, что он просто дает мне анализ ошибок, и я не знаю, что я сделал неправильно здесь.
Большое спасибо за помощь!
здесь я сделал несколько вещей сейчас (разбор первых двух строк теперь работает): может быть, у кого-нибудь есть хороший совет для меня, что я мог бы сделать лучше. Большое спасибо.
if ((fp = fopen("df.dot","r")) == NULL)
{
printf("Error: File Open\n");
return 1;
}
int row = 0; // check row 1
while (fgets(buffer, MAX_PARSING, fp))
{
if ((row == 0) && strncmp(buffer, "readEveryLine\n", 14) == 0)
{
printf("%s", buffer);
}
else
{
printf("Parsing Error 1\n");
}
}
int row1 = 1; // check row 2
while (fgets(buffer, MAX_PARSING, fp))
{
if ((row1 == 1) && strncmp(buffer, "{\n", 2) == 0)
{
printf("%s", buffer);
}
else
{
printf("Parsing Error 2\n");
}
}
int row2 = 2; // check other rows (dynamic, could be even more or less)
while (fgets(buffer, MAX_PARSING, fp))
{
if ((row2 == 2) && strncmp(buffer, " ", 2) == 0)
{
const char *p1 = strstr(fp, "\"")+1;
const char *p2 = strstr(p1, " [m]\"");
const char *p3 = strstr(p1, " [f]\"");
// extract male persons
if (p1 && p2)
{
size_t len1 = p2 - p1;
char* res1 = (char*)malloc(sizeof(char)*(len1 + 1));
strncpy(res1, p1, len1);
res1[len1] = '\0';
// give res1 for functionMale() to work on that string
}
// extract female persons
else if (p1 && p3)
{
size_t len2 = p3 - p1;
char* res2 = (char*)malloc(sizeof(char)*(len2 + 1));
strncpy(res2, p1, len2);
res2[len2] = '\0';
// give res2 for functionFemale() to work on that string
}
else if (strcmp(buffer, " -> ") == 0)
{
// work in progress (quite complicated to do this i think)
// it has to be a realtion between two people
}
else if (strcmp(buffer, ";") == 0)
{
// work in progress
// this sign can either exist like this:
// "Bart [m]" -> "Marge [f]";
// or like this:
// "Marge [f]";
}
break;
}
else
{
printf("Parsing Error 3\n");
}
row2++;
}
// и самый последний знак должен быть }\n
string
иchangeLastC()
, 2) Убедитесь, что предупреждения компилятора полностью включены. 3) Почему ожидается, что"readEveryLine\n"
будет равно"readEveryLine"
? В противном случае проблема не точно определена. - person chux - Reinstate Monica   schedule 02.01.2017strncmp
? Правильная функция для этой цели —strcmp
. - person rici   schedule 02.01.2017\n
изменяется на\0
функциейchangeLastC()
- person Gerhardh   schedule 03.01.2017changeLastC()
, неправильной настройкойstring
или многими другими причинами. Приведенный код недостаточен для диагностики. - person chux - Reinstate Monica   schedule 03.01.2017if
истинно, а второеif
ложно, потому что ни одна строка не может соответствовать двум разным литералам. Для каждой второй строки файла уже перваяif
является ложной, и мы вводим часть else, где печатается анализ ошибок. Это то, что он описывает как ошибку. Возможно, есть и другие скрытые ошибки, о которых он еще не упомянул. Но сначала ему нужно разобраться с этой проблемой. - person Gerhardh   schedule 03.01.2017strncmp(*file_string, "readEveryLine\0", 14)
может возвращать совпадение ('0'), и использование другого строкового литералаstrncmp(*file_string, "readEveryLine", 14)
также может возвращать то же самое. Но это не главная проблема здесь. - person chux - Reinstate Monica   schedule 03.01.2017