【问题标题】:Error: Segmentation fault using fopen and open错误:使用 fopen 和 open 的分段错误
【发布时间】:2015-10-07 21:55:14
【问题描述】:

我正在使用 I2C 协议将 BeagleBoneBlack 与 IMU 连接起来。我已经在控制台中很好地读取了数据,但是当我尝试将数据存储在 .txt 文件中时,它返回错误:分段错误。

int I2C_open()
{
    int file;
    char *dev = "/dev/i2c-1";
    if ((file=open(dev,O_RDWR))<0);
    {
        perror("Abrir el canal");
    }
    return file;
}

int main()
{
    archivo=I2C_open();
    f=fopen("./home/debian/Desktop/Comunicacion/Prueba.txt","W");
    fprintf(f,"Datos leidos del sensor");
}

这只是代码的一部分,因为它很大。当我使用 fprintf 时出现问题,当我评论该行代码运行良好时。我不确定是否是因为我在“/dev/i2c-1”运行时使用了 fopen。请帮忙

【问题讨论】:

  • 您是否包含了正确的头文件?当 -Wall 被传递给它时,gcc 会说什么?当你对它运行strace 时,错误出现在哪里?
  • fopen()中的文件名是相对路径。路径存在吗?你检查fopen()是否返回非NULL文件描述?
  • 我刚刚检查过,'fopen()' 返回一个 NULL 文件。我的头文件是'#include #include #include #include #include #include #include #include '
  • fopen() return NULL 因为它无法在不存在的目录中创建文件。在指定文件时使用完整路径而不是相对路径。或者不指定路径,文件将在当前工作目录中创建。

标签: c


【解决方案1】:

注意:您使用"W" 而不是"w" 作为 fopen 的打开模式。这才是真正的问题。

但是,您应该始终在 fopen 之后检查“f”变量是否为 NULL。我相当确定它为 NULL [这意味着您无法打开文件]。这只是一个好习惯。这比追踪段错误要容易得多。

你有:

f=fopen("./home/debian/Desktop/Comunicacion/Prueba.txt","W");
fprintf(f,"Datos leidos del sensor");

将其更改为:

f=fopen("./home/debian/Desktop/Comunicacion/Prueba.txt","w");
if (f == NULL) {
    perror("fopen");
    exit(1);
}
fprintf(f,"Datos leidos del sensor");

【讨论】:

    【解决方案2】:

    您错过了fprintf 语句中的文件指针

    fprintf("Datos leidos del sensor");
    

    试试

    fprintf(f, "Datos leidos del sensor");
    

    【讨论】:

    • 不抱歉,我正在使用 fprintf(f,"Datos leidos del sensor") 并且我遇到了这个问题,错误不是那个。
    • @Juan Bravo 所以这不是你的代码?好的,既然fprintf是你的问题,你为什么不检查fopen()返回的f
    • 我用 fprintf(f,"Datos del sensor") 编写了我的代码。当我写这个问题时,我写得不好,但在我的代码中,函数是按照你说的写的
    • @Juan Bravo 那么例如添加if((f=fopen("./home/debian/Desktop/Comunicacion/Prueba.txt","W")) == NULL) exit(1); 怎么样?我的意思是您在使用 fprintf 时遇到问题,这是您编写的实际代码还是浪费时间?
    • 如何检查 'fopen()1 返回的 'f' 是否正确? @风向标
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-03
    • 2017-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多