【发布时间】:2017-01-02 15:21:00
【问题描述】:
我想从一个看起来像这样的文件中读取每一行:
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
【问题讨论】:
-
1)
string和changeLastC()的后定义,2) 确保编译器警告完全启用。 3) 为什么期望"readEveryLine\n"等于"readEveryLine"?否则问题没有很好地说明。 -
你到底为什么要使用
strncmp?用于此目的的正确函数是strcmp。 -
@chux,行尾没有'\n'。根据评论
\n通过函数changeLastC()更改为\0 -
@Gerhardh 是的,我的评论的第三部分应该不适用,但 cmets 不驱动代码 - 只提示需要什么。 OP 的问题很可能是由不起作用的
changeLastC()、string的错误设置或许多其他原因引起的。发布的代码不足以诊断。 -
@chux,为什么不够?正如我在分析器中提到的那样,循环被打破了。除了“错误解析”之外,您永远无法得到任何东西。对于第一行,第一个
if为真,但第二个if为假,因为任何字符串都不能匹配两个不同的文字。对于文件的每一行,第一个if已经为 false,我们输入打印“错误解析”的 else 部分。这就是他所说的错误。也许还有其他他没有提到的隐藏错误。但他首先需要解决这个问题。
标签: c file parsing fgets strncmp