首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在C中读取文件,fget进入永续循环

在C中读取文件,fget进入永续循环
EN

Stack Overflow用户
提问于 2022-04-18 08:17:50
回答 1查看 42关注 0票数 1

我试图用fgets在C中读取基本文件。它应该读取一行,将其传递给tokeniser函数,该函数应该在每个' '上将其拆分,并将其添加到链接列表中。目前,它正在进入一个永无止境的循环,我不知道为什么。任何帮助都是非常感谢的。我真的很纠结于这个C语言

代码语言:javascript
复制
#define INPUTSIZE 11

void tokeniseString(LinkedList *list, char *str)
{
    char *token = strtok(str, " ");

    while (token != NULL)
    {
        insertLast(list, *token);
    }
}

void readInputFile(char *fileName, LinkedList *list)
{
    FILE* inputFile = fopen(fileName, "r");
    char str[INPUTSIZE];

    printf("1");
    if (inputFile == NULL)
    {
        perror("Could not open file");
    }
    else
    {
        while (fgets(str, INPUTSIZE, inputFile) != NULL)
        {
            tokeniseString(list, str);
        }
        
        if (ferror(inputFile))
        {
            perror("Error while reading from file");
        }
    }
}
EN

回答 1

Stack Overflow用户

发布于 2022-04-18 08:26:43

您有一个没完没了的循环,因为您没有扫描循环主体中的下一个令牌。你应该写:

代码语言:javascript
复制
void tokeniseString(LinkedList *list, char *str) {
    char *token = strtok(str, " ");

    while (token != NULL) {
        insertLast(list, *token);
        token = strtok(NULL, " ");
    }
}

但是,不能将令牌的第一个字节的值插入到列表中。您可能应该使用strtol()将令牌转换为数字:

代码语言:javascript
复制
#include <errno.h>
#include <limits.h>
#include <string.h>
#include <stdlib.h>

void tokeniseString(LinkedList *list, char *str) {
    char *token = strtok(str, " \t\r\n");

    while (token != NULL) {
        char *p;
        long value;
        errno = 0;
        value = strtol(token, &p, 10);
        if (p == token || *p != '\0') {
            fprintf(stderr, "token is not a number: %s\n", token);
        } else
        if (errno != 0 || value > INT_MAX || value < INT_MIN) {
            fprintf(stderr, "number is out of range: %s\n", token);
        } else {
            insertLast(list, (int)value);
        }
        token = strtok(NULL, " \t\r\n");
    }
}

请注意,修改字符串参数被认为是错误的做法,特别是使用对静态状态(如strtok() )有副作用的函数。以下是另一个不修改参数的版本:

代码语言:javascript
复制
#include <errno.h>
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void tokeniseString(LinkedList *list, const char *str) {
    for (;;) {
        char *p;
        long value;
        int len;

        /* skip whitespace */
        str += strspn(str, " \t\r\n");
        if (*str == '\0')
            break;
        /* get the length of the token */
        len = strcspn(str, " \t\r\n");
        errno = 0;
        value = strtol(token, &p, 10);
        if (p == str) {
            fprintf(stderr, "token is not a number: %.*s\n", len, str);
        } else
        if (p != str + len) {
            fprintf(stderr, "token has extra characters: %.*s\n", len, str);
        } else
        if (errno != 0 || value > INT_MAX || value < INT_MIN) {
            fprintf(stderr, "number is out of range: %.*s\n", len, str);
        } else {
            insertLast(list, (int)value);
        }
        str += len;
    }
}

还请注意,您必须关闭readInputFile()中的文件。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71909291

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档