我正在尝试在简单的while循环中使用fgets。 fgets只是没有被召唤。
完整代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define LINE_BUFF 20
#define OSPID //Here is where I would put the ospid I was interested in
int readContentsOfProcessMapsFile(int target);
int main(int argc, char** argv) {
char lineprompt[LINE_BUFF];
char command1[LINE_BUFF], command2[LINE_BUFF];
int flag;
if( readContentsOfProcessMapsFile(OSPID) != 0)
{
printf("Error reading file");
exit(EXIT_FAILURE);
}
while(1) {
fflush(stdout);
printf("enter name:>");
if ( fgets(lineprompt, sizeof(lineprompt), stdin) == NULL)
{
printf("Error using fgets\n");
break;
}
sscanf(lineprompt, "%s %s", &command1, &command2);
if (strcmp(command1, "show") == 0)
{
if( (strcmp(command2, "active") == 0) )
{
flag = 1;
}
else if( (strcmp(command2, "inactive") == 0) )
{
flag = 2;
}
else
{
flag =0;
}
printf("run show function on ospid file");
}
else if (strcmp(command1, "exit") == 0)
{
printf("run exit/cleanup");
break;
}
else if (strcmp(command1, "help") == 0)
{
printf("run help function");
continue;
}
else {
printf("Nothing entered, run help function");
continue;
}
}
}
int readContentsOfProcessMapsFile(int target) {
FILE *fd; // /proc/<target>/maps
char name[128], *line = NULL, *match = NULL;
size_t len = 0;
char* filename = NULL;
snprintf(name, sizeof (name), "/proc/%u/maps", target);
if ((fd = fopen(name, "r")) == NULL) {
printf("error");
return (EXIT_FAILURE);
}
while (getline(&line, &len, fd) != -1)
{
unsigned long start, end;
char read, write, exec, cow;
int offset, dev_major, dev_minor, inode;
filename = realloca(filename, len);
sscanf(line, "%p-%p %c%c%c%c %x %x:%x %u %[^\n]", &start, &end, &read,
&write, &exec, &cow, &offset, &dev_major, &dev_minor, &inode, filename);
match = strstr(filename, "/ora_");
if (match != NULL)
{
printf("##lowAddr:%p, highAddr:%p and filename:%s\n", start, end, name);
}
}
free(filename);
free(line);
if (fclose(fd) == -1))
{
printf("Failed to close %s", fd);
return (EXIT_FAILURE);
}
return (EXIT_SUCCESS);
}
我尝试在while循环之后添加fseek(stdin,0,SEEK_END);
和fflush(stdin);
,但仍然会跳过fgets()
。我理解使用fflush(stdin)
无论如何都不是好事。
当发生这种情况时getchar()
打印正方形或Y,其上方有两个点。所以我认为fgets()
被忽略的原因是它正在拾取这些字符吗?任何人都可以提供一种方法来阻止/阻止这种情况吗?
感谢所有评论。我已将其缩小到上述readContentsOfProcessMapsFile
函数。如果我对此进行评论,那么fgets
将按预期工作。
现在我修复了关于close(fd)
的拼写错误,它似乎并没有真正关闭文件!刚发现我自己的错误!已更改为fclose
,但看到了同样的问题
答案 0 :(得分:0)
我正在尝试在简单的while循环中使用fgets。 fgets只是没有被调用。 ...
当你试图解决的问题被分散注意力时,很可能你会把所有的努力花在分心而不是问题上。如图所示,您的代码不仅包含您描述的问题,还包含一系列干扰。
评论为 clean up your distractions 提供了一些建议。以下是我对不分心的看法:
在循环读取标准输入示例中使用 fgets的一个非常简单的示例:
#include <stdio.h>
int main(void)
{
char temp[BUFSIZ]; //BUFSIZ defined as 512 in stdio on my system.
while((fgets(temp,5,stdin)) != NULL)
printf("%s\n",temp);
return 0;
}
EOF会导致循环退出。 (ctrl-C在Windows上停止)
当你开始使用它时,慢慢开始在它周围包含其他所需的功能,每次添加的功能都不会破坏代码时进行验证。随着您的进步,您可能会偶尔遇到错误,当发生这种情况时,请使用 step-wise, pragmatic approach to determining the problem ,然后继续。