我有一个文件来读取充满数字和数字之间的空格。我已经初始化了一个链表数组,一行对应数组的一个索引,一个数字对应列表中的一个节点。
我想要fscanf
每一行扫描每个数字,并把它放在列表中,但我希望它在行尾停止,这样我就可以循环它,这样下一行就会到数组的下一个索引。我想使用fgetc
,但有些数字超过1位,我认为如果我使用它会更难。
for (int i = 0; i < N; i++) {
do {
node *new = (node *)malloc(sizeof(node));
fscanf(fp, "%i", &new->data);
new->next = NULL;
new->prev = NULL;
if (*head == NULL) {
*head = new;
} else {
operand *temp = *head;
while (temp != NULL) {
temp = temp->next;
}
if (temp->next == NULL) {
new->prev = temp;
temp->next = new;
}
}
} while (new->data != 'n');
我不知道该在while循环中放些什么,让它在行尾停止,让我的for循环更新到新的索引。有正确的方法吗?
为了确保fscanf()
不占用数字后面的空白,包括换行符,您应该删除格式字符串末尾的空格:
fscanf(fp, "%i", &new->data);
要在换行符处停止内循环,将代码更改为:
for (int i = 0; i < N; i++) {
int c;
int data;
while (fscanf(fp, "%i", &data) == 1) {
node *new = (node *)malloc(sizeof(*new));
new->data = data;
new->next = NULL;
new->prev = NULL;
if (*head == NULL) {
*head = new;
} else {
node *temp = *head;
while (temp->next != NULL) {
temp = temp->next;
}
new->prev = temp;
temp->next = new;
}
// ignore trailing whitespace
while ((c = fgetc(fp)) == ' ' || c == 't')
continue;
// detect end of line
if (c == 'n' || c == EOF)
break;
ungetc(c, fp);
}
...
}