IAR, 嵌入式软件, 文件IO

在IAR中如何使用fopen读取某路径下的txt文件?
如:
FILE* fp = fopen("E:/K226_MASTER_QT_TEST/map.txt", "r");
这一句在windows上就可以运行, 在IAR中fp就一直为NULL, 请教

img

单片机裸奔系统哪来的文件,你要先移植个文件系统进去才可以啊。
再说了,单片机程序是在单片机上运行的,你让它打开电脑路径上的文件怎么打开啊。

结合自身经验及chatgpt回答
在 IAR 中,可能存在以下几种原因导致 fopen 函数返回空指针:

  1. 文件路径:在 IAR 中,应该使用相对路径或者绝对路径打开文件。相对路径是相对于 IAR 项目的根目录而言的,而不是相对于程序运行的可执行文件。请注意,IAR 编辑器中的“Working directory”并不能影响程序本身的工作目录,即无法直接影响相对路径的查找。

  2. 文件访问权限:在 IAR 中,需要确保到文件的路径是可读、可写和可执行的。需要检查以下文件访问权限,包括文件和文件夹的权限。

  3. 文件不存在:在 IAR 中,文件路径并不存在也会导致 fopen 函数返回 NULL。请确保文件路径正确且确实存在。

  4. 编译器不支持:IAR 使用的是某个特定版本的 C 标准库,如果 fopen 函数不支持该版本的库,则可能会返回 NULL。建议检查一下相关文档以确定支持的库版本。

使用相对路径试试

把文件放到项目路径下 看看是不是还是返回null

跟在Windows上的方式是相同的

#include <stdio.h>
#include <stdlib.h>

#define MAX_LINE_LENGTH 256

int ReadFile(const char* filename, uint8_t** array, uint8_t num_rows, uint16_t* num_cols) {
    FILE* fp = fopen(filename, "r");
    if (fp == NULL) {
        printf("Failed to open file: %s\n", filename);
        return -1;
    }
    
    // 分配内存
    uint8_t** data = (uint8_t**)malloc(num_rows * sizeof(uint8_t*));
    for (uint8_t i = 0; i < num_rows; i++) {
        data[i] = (uint8_t*)malloc(MAX_LINE_LENGTH * sizeof(uint8_t));
    }
    
    // 读取文件内容
    uint8_t row = 0;
    uint16_t max_cols = 0;
    char line[MAX_LINE_LENGTH];
    while (fgets(line, sizeof(line), fp) != NULL) {
        uint16_t len = strlen(line);
        if (len > max_cols) {
            max_cols = len;
        }
        strncpy(data[row], line, len);
        row++;
    }
    
    // 更新num_cols的值
    *num_cols = max_cols;
    
    // 将读取的数据赋值给array
    *array = data;
    
    // 关闭文件
    fclose(fp);
    
    return 0;
}


回答部分参考、引用ChatGpt以便为您提供更准确的答案:

根据您的描述,您在IAR中使用fopen函数读取某路径下的txt文件时,无法成功打开文件,fp一直为NULL。这可能是由于文件路径的格式或文件访问权限的问题。

首先,确保文件路径的格式是正确的。在Windows系统中,文件路径使用反斜杠(\)作为分隔符。而在一些嵌入式系统或跨平台开发环境中,文件路径使用正斜杠(/)作为分隔符。因此,您可以尝试使用以下两种格式中的一种来指定文件路径:

  1. 使用正斜杠(/)作为路径分隔符:
FILE* fp = fopen("E:/K226_MASTER_QT_TEST/map.txt", "r");
  1. 使用双反斜杠(\\)作为路径分隔符,并在字符串前加上R前缀以表示原始字符串(raw string):
FILE* fp = fopen(R"E:\K226_MASTER_QT_TEST\map.txt", "r");

如果文件路径的格式正确,但仍然无法打开文件,那么可能是由于文件访问权限的问题。请确保您具有读取文件的权限,以及文件是否存在于指定路径下。

如果问题仍然存在,建议检查文件路径是否正确,文件是否存在,并且尝试在其他环境中使用相同的文件路径和代码进行测试,以确定问题所在。

你首先要解决的就是文件系统问题,有了才能使用fopen函数的

fopen读写文件


#include <stdio.h>  
#include <stdlib.h>  
  
void write_file(FILE *fp, unsigned char *arr, int len)  
{  
    int i = 0;
    for(i = 0 ; i < len; i+=2)  
    {     
        fprintf(fp,"0x%x,\n", arr[i]);  
    }  
} 
void read_file(FILE *fp, unsigned char* arr, int len)
{
    int i = 0;
    for (i = 0; i < len; i++)
    {
        fscanf(fp, "%c", arr+i);
    }
    
} 
  
int main(void)  
{  
    FILE *fp1, *fp2;  
    unsigned char *arr;
    arr = (unsigned char *)malloc(4096);
    fp1=fopen("test.txt", "rb");
    fp2=fopen("out.txt","a+"); 
    read_file(fp1, arr, 4096);
    write_file(fp2, arr, 4096);  
    fclose(fp1);  
    fclose(fp2);
    free(arr);  
    return 0;
} 

换思路,windows的东西移植到嵌入式上如果没有文件系统,就把文件内容定义到flash中去(比如定义一个const类型的大数组),读数组再实现你下面的功能

IAR是用来给MCU编写程序的IDE,如果想用MCU读取文件,需要硬件有存储器并移植了文件系统(例如FatFs)。
你现在的代码是windows上的读写文件操作,应该用VS编译执行。

你有移植文件系统进来吗,没有的话肯定失败,windows调用支持吧

文件路径的问题啊。你在windows电脑上当然是可以的,windows电脑上的文件路径格式就是E://xxx 这样的形式,但是你作为嵌入式程序之后,就需要确保你的硬件上有文件系统,而且文件系统的格式也应该是和电脑端的不一样,因此路径格式是不一样的。这一块的知识和原理,建议你还是先去学习下再来写程序。