[英]Missing last IP address
我有一个文件,正在尝试将IP地址存储到数组中。 我的计划是将数据存储到逗号或将地址后的字符存储到哑变量中。 由于某种原因,我的代码可以工作到第二行。 任何帮助都会很棒。
Blacklist.csv:
46.30.45.65, good.recycle2learn.com
22.51.66.23, hothouse.com
83.98.11.48, monkeyhouse.com
编码:
void Blacklist()
{
FILE *blist;
char quotations = 0;
blist = fopen("blacklist.csv", "r");
if (blist == NULL)
{
//Quit if something goes wrong
exit(EXIT_FAILURE);
}
for (int i = 0; i <= 3; i++)
{
fscanf(blist, "%d.%d.%d.%d,", &blacklist[i][0], &blacklist[i][1],
&blacklist[i][2], &blacklist[i][3]);
while (quotations != '\n')
{
fscanf(blist, "%c,", "ations);
}
}
for (int i = 0; i <= 3; i++)
{
printf("%d.%d.%d.%d\n", blacklist[i][0], blacklist[i][1], blacklist[i][2],
blacklist[i][3]);
}
}
阅读完每一行后,您无需重新设置quotations
变量(鉴于其用途,该变量的名称不太好)。 一旦到达第一个换行符,您的while
循环将不再被输入。 如果您在调试器中运行代码,您将会看到这种情况。
读取IP地址后,请重置变量:
for (int i = 0; i < 3; i++) // <-- use < instead of <=
{
fscanf(blist, "%d.%d.%d.%d,", &blacklist[i][0], &blacklist[i][1], &blacklist[i][2], &blacklist[i][3]);
quotations = 0; // <-- add this
while (quotations != '\n')
{
fscanf(blist, "%c", "ations); // <-- no comma after %c
}
}
否则使用do..while
循环代替:
for (int i = 0; i < 3; i++)
{
fscanf(blist, "%d.%d.%d.%d,", &blacklist[i][0], &blacklist[i][1], &blacklist[i][2], &blacklist[i][3]);
do
{
fscanf(blist, "%c", "ations);
}
while (quotations != '\n');
}
更新 :也就是说,您的代码无法处理csv文件在每个IP条目之间包含空白行的可能性(如您的问题所示),或者在最后一个条目之后缺少换行符。 要解决这些问题,请尝试使用fgets()
或getline()
将文件逐行读取到本地缓冲区中,并根据需要使用sscanf()
解析缓冲区。
int blacklist[3][4];
int numblacklist;
void Blacklist()
{
FILE *blist;
char line[64];
memset(blacklist, 0, sizeof(blacklist));
numblacklist = 0;
blist = fopen("blacklist.csv", "r");
if (blist == NULL)
{
//Quit if something goes wrong
exit(EXIT_FAILURE);
}
while (fgets(line, 64, blist))
{
if (sscanf(line, "%d.%d.%d.%d,", &blacklist[numblacklist][0], &blacklist[numblacklist][1], &blacklist[numblacklist][2], &blacklist[numblacklist][3]) == 4)
{
numblacklist++;
if (numblacklist == 3)
break;
}
}
fclose(blist);
for (int i = 0; i < numblacklist; i++)
{
printf("%d.%d.%d.%d\n", blacklist[i][0], blacklist[i][1], blacklist[i][2], blacklist[i][3]);
}
}
要么:
int blacklist[3][4];
int numblacklist;
void Blacklist()
{
FILE *blist;
size_t linelen;
char *line;
memset(blacklist, 0, sizeof(blacklist));
numblacklist = 0;
blist = fopen("blacklist.csv", "r");
if (blist == NULL)
{
//Quit if something goes wrong
exit(EXIT_FAILURE);
}
line = NULL;
linelen = 0;
while (getline(&line, &linelen, blist) != -1)
{
if (sscanf(line, "%d.%d.%d.%d,", &blacklist[numblacklist][0], &blacklist[numblacklist][1], &blacklist[numblacklist][2], &blacklist[numblacklist][3]) == 4)
{
numblacklist++;
if (numblacklist == 3)
break;
}
}
free(line);
fclose(blist);
for (int i = 0; i < numblacklist; i++)
{
printf("%d.%d.%d.%d\n", blacklist[i][0], blacklist[i][1], blacklist[i][2], blacklist[i][3]);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.