1

我正在使用ndk工具链构建以下代码来测试android的文件操作能力。并且,在 /data 中,读或写的权限无疑是 Ok 的。但是,我对为什么 fopen() 不起作用并返回 NULL 感到困惑。这是代码:

#include <unistd.h>
#include <stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
void main()
{
    int fd;
    int count = 128;
    int offset = 32;
    int ret;
    char buf[1024]="hi ! this is pwrite.";
    char pathname[128] = "/data/pwrite.txt";
    /*fd = fopen(pathname, O_WRONLY);*/
    FILE *infile;
    infile = fopen(pathname, "rb");
    if(infile==NULL) printf("fopen error  \n");
    /*if(fd==-1)printf("open error \n");*/
    if((ret = pwrite(fd, buf, count, offset))==-1)
    {
        printf("pwrite error\n");
        exit(1);
    }
    else
    {
        printf("pwrite success\n");
        printf("the writed data is:%s", buf);
    }
}

我直接在Android中运行代码时,提示如下:

# ./test
fopen error  
pwrite error

有任何想法吗?

4

2 回答 2

2

除了你的文件模式问题,

"/data/pwrite.txt"

不应是 android 应用程序用户 ID 或什至(在安全设备上)adb shell 用户可访问的位置。

从大约 android 2.2 开始(但随时可能更改),/data/local 可用作 adb shell 用户的暂存区。对于应用程序中的代码,每个应用程序用户 ID 都有它自己的包唯一私有存储区域,可通过其中一个 java 级别的 api 调用找到 - 我认为它类似于 getFilesDir() - 你真的应该使用它来实现可移植性而不是硬编码路径.

WRITE_EXTERNAL_STORAGE 权限仅在您希望使用“外部存储”(取决于可能被焊接的设备或实际的可移动卡)而不是内部存储时才相关。再次,您应该真正通过 api 调用获取设备特定路径,而不是不可移植地假设它类似于 /mnt/sdcard

于 2012-06-04T17:21:43.463 回答
1

rb在打开文件时给出了模式,这只是意味着读取二进制文件。现在您正在执行write错误的操作。你应该给写模式如下,

infile = fopen(pathname, "wb");
于 2012-05-28T03:42:23.480 回答