【问题标题】:File I/O program in C: Segmention Fault (core dumped)C 中的文件 I/O 程序:分段错误(核心转储)
【发布时间】:2015-01-21 05:24:34
【问题描述】:

我正在编写一个程序来从文件中读取十六进制代码并通过 SPI 将其馈送到另一个芯片。我正在尝试使用 fgets 从 hexfile 中读取每一行,然后使用 sscanf 将其解析为 unsinged int array hexfile 的格式是如下:

ff32
34dc
1234
32d4

....

int main (void)
{
    FILE *fp1;
    int i = 0;
    fp1 = fopen("hexfile.txt", "r+");
    char line[500];
    unsigned int hex[40];

    while (fgets(line, sizeof(line), fp1) != NULL) {

        while (sscanf(line, "%x", &hex[i]) == 1) {
                    printf("%4x \n", hex[i]);
                    i++;
            }
    }

    fclose(fp1);
    return 0;
}

错误: 分段错误(核心转储)当您尝试取消引用 NULL 指针时,我大致知道结果。但是我的代码有什么问题?其次,有没有更好的方法在没有动态内存分配的情况下使用其他文件 I/O 函数从文件中读取?

【问题讨论】:

  • fopen 返回码未经测试。范围测试 (

标签: c file io embedded spi


【解决方案1】:

这个循环会一直重复,或者直到写信给hex[i] 会出错

while (sscanf(line, "%x", &hex[i]) == 1) {

在回答 OP 的第二个问题时,这是另一种方式

#include <stdio.h>

int main()
    {
    FILE *fp1;
    int i = 0, j;
    unsigned int hex[40];
    fp1 = fopen("hexfile.txt", "rt");
    while (i<40 && fscanf (fp1, "%x", &hex[i]) == 1)
        i++;
    fclose(fp1);

    for (j=0; j<i; j++)               // check
        printf("%4x \n", hex[j]);
    return 0;
}

【讨论】:

    【解决方案2】:

    你需要把while去掉,换成if:

    FILE *fp1;
    int i = 0;
    fp1 = fopen("d:\hexfile.txt", "r+");
    char line[500];
    unsigned int hex[40];
    
    while (fgets(line, 8, fp1) != NULL) {
        if (sscanf(line, "%x", &hex[i]) == 1) {  /*here while => if */ 
            printf("%4x \n", hex[i]);
            i++;
        }
    }
    
    fclose(fp1);
    

    【讨论】:

    • 谢谢解决了,while有什么问题?只要 sscanf 可以从该行读取输入,它就不会返回 1 吗?
    • 好吧,您已经阅读了该行,因此您不需要另一行,而它只是继续阅读相同的“行”并返回 1 ! ,您只需要确保它读取该行一次! ,容易出错!
    • 注意sscanf(line,...fscanf(fp1,...) 之间的区别。在 OP 的 while 循环中,第一个将继续做同样的事情,除非您替换 line。第二,从文件fp1中读取更多数据。
    猜你喜欢
    • 2019-01-14
    • 1970-01-01
    • 2017-11-10
    • 2021-03-04
    • 2022-01-14
    • 2017-02-25
    • 2016-07-12
    • 2018-03-16
    • 1970-01-01
    相关资源
    最近更新 更多