我正在使用此函数读取包含字符串的文本文件,这些字符串被读取并插入到 AVL 树中。在 Windows 中一切正常,但是一旦我尝试在 Linux 中运行它,它会产生完全不同的结果(我得到一堆冗余节点,它们的键只是空格)。谁能解释为什么会这样?

node *read_file(char *list_name) 
{ 
    char array[255]; 
    char *token = NULL; 
    node *found = NULL;  
    node *tree = NULL; 
    FILE *file = fopen(list_name, "r"); 
 
    if (file == NULL) 
    { 
        printf("Could not open file\n"); 
        return NULL; 
    } 
 
    while (fgets(array, 255, file) != NULL)  
    { 
        token = strtok(array, " \n");  
        while (token != NULL)       
        {        
            found = find_key(token, tree); 
 
            if (found == NULL) 
            { 
                tree = insert(token, tree); 
            } 
            else  
            { 
                found->frequency++; 
            } 
            token = strtok(NULL, " \n");  
        } 
    } 
 
    fclose(file); 
    return tree; 
} 

请您参考如下方法:

如果您在 Windows 中使用 stdio 时遇到问题,请尊重 unix(或 linux),只需始终使用 b 说明符来调用 fopen(3)。 unix 中的行终止符由单个 \n 字符组成,而在 windows 中它们由一系列 \r\n 字符组成。 Windows 端口采用的解决方案包括允许您指定 "rt",而不是 "r"fopen(3) 调用,因此 \r 在将它们传递给调用代码之前被过滤掉。可能你的问题将通过使用 "rt" 而不是 "r" 来解决(Posix 规范允许在 unix 中使用这个标志,但忽略它,所以使用它always 是无害的)还有另一个 "b" 说明符,它允许您将该文件视为二进制文件(因此消除所有 \r 字符的转换不是完成。这主要是指二进制文件。


评论关闭
IT序号网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!