在C中使用strtol逐行读取文本文件

Posted

技术标签:

【中文标题】在C中使用strtol逐行读取文本文件【英文标题】:Reading text files with strtol in C line by line 【发布时间】:2014-03-23 09:48:55 【问题描述】:

好的,所以我有了这个函数,它可以找到文件中所有数字的平均值:

float averageOfNumbers(FILE *fp_in)

    int n=0,S=0;
    char red[1024];char *ptr;
    int p_a_h;
    float sr;

    while(!feof(fp_in))
    if(fgets(red,1024,fp_in)!=NULL)
        ptr =red;
    while(p_a_h = strtol(ptr, &ptr, 10))

        if((p_a_h>0&&S>INT_MAX-p_a_h)||(p_a_h<0&&S<INT_MIN-p_a_h))
            printf("OVERFLOW\n");
            break;
        
        else
        S=p_a_h+S;
        n++;

        
    
    
    sr=S/n;
    return sr;

当文件中只有数字时它可以正常工作,但如果它找到除数字以外的任何内容,程序将崩溃。我怎样才能使程序忽略其他符号。例如这里是一个文本文件:

wdadwa 321 1231 das 421124 1 wdasdad 4 1412515
sad14312 yitiyt453534 3554312 sad -2 -53 -12 -231 #@!
#!312 -2 241 -46343 sada 21312 65454

平均值应为:310422

【问题讨论】:

feof() is wrongly used 以上。 【参考方案1】:

if 条件中添加额外检查。

p_a_h==0 && (strlen(ptr)>1 || (strlen(ptr)==1 && ptr[0]!='0'))

如果转换无效(如果字符串包含非数字字符),我正在利用 strtol 返回 0L 的事实。但是单独检查这个,如果实际字符串包含0,也会跳过。剩下的我自己去理解吧。

【讨论】:

以上是关于在C中使用strtol逐行读取文本文件的主要内容,如果未能解决你的问题,请参考以下文章

关于C语言中文本文件的逐行读取的实现

C++文件读写操作逐字符读取文本和逐行读取文本

在 C 中逐行浏览文本文件

Objective C - 创建文本文件以在 Cocoa 中逐行读取和写入

delphi中怎么逐行读取文本文件的数据并将每行分别写入指定的不同编辑框

C 语言文件操作 ( 配置文件读写 | 读取配置文件 | 函数接口形参 | 读取配置文件的逐行遍历操作 | 读取一行文本 | 查找字符 | 删除字符串前后空格 )