簡體   English   中英

在 iOS 的 .c 文件中讀取 .txt 文件

[英]Read .txt file in .c file for iOS

背景

我正在開發一個應用程序,該應用程序調用我公司以前用(純)C 編寫的庫。我的應用程序的主要部分是用 Obj-C 編寫的。 在 C 代碼的某一時刻,庫需要打開一個 .txt 文件並從中讀取數據。 .txt 文件將由 Obj-C 在應用程序的主要部分創建。


問題

我無法使用 C 代碼來查找 .txt 文件。 具體來說,當我嘗試fopen文件並將其分配給FILE變量時,該變量始終為NULL 現在,該文件正在寫入我的應用程序的 Documents 文件夾(但如果這是問題,那么我可以更改它)。 我啟用了文件共享,因此我能夠使用 iTunes 驗證文件是否正確寫入並存在於 Documents 文件夾中。


我的嘗試

這是我迄今為止嘗試過的一些代碼。

在應用程序中:

NSURL *docs = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
const char *dir = [docs UTF8String];
myLibraryEntryPoint(dir,(int)[docs length]);

在圖書館:

char *new_str;
if ((new_str = malloc(strlen(directory)+strlen("/myFile.txt")+1)) != NULL)
{
    new_str[0] = '\0';
    strcat(new_str,directory);
    strcat(new_str,"/myFile.txt");
}
else
{
    fprintf(stderr, "malloc failed!");
}
FILE *fp=fopen(new_str, "r");

我還在庫中嘗試了以下內容:

FILE *fp=fopen("Documents/myFile.txt", "r");
FILE *fp=fopen("/Documents/myFile.txt", "r");
FILE *fp=fopen("myFile.txt", "r");
FILE *fp=fopen("/myFile.txt", "r");
FILE *fp=fopen("Documents\myFile.txt", "r");
FILE *fp=fopen("Documents\\myFile.txt", "r");
FILE *fp=fopen("\Documents\myFile.txt", "r");
FILE *fp=fopen("\\Documents\\myFile.txt", "r");

正如我上面所說,在每次嘗試之后, fp始終為NULL c 中在 iOS 環境中打開文件的正確語法是什么? 我沒有作在我的構建設置的任何更改為我的項目,以改變工作目錄,覆蓋所有的這些問題,因為不像那些問題,我的應用程序創建的.txt文件本身。


分辨率

原來文件路徑區分大小寫。 我的圖書館正在尋找myFile.TXT ,我的應用程序正在寫入myFile.txt FML。

我將把這個問題留在這里,因為我認為評論中有一些很好的信息以及關於文件路徑語法以及庫如何處理當前目錄的建議答案。 這些信息將來可能對其他人有用。

在 Objective-C 中可以像這樣訪問Documents目錄的路徑:

NSString *documentsPath = NSSearchPathForDirectoriesInDomains( NSDocumentDirectory, NSUserDomainMask, YES)[0];

在 C 中使用這樣的 NSString 路徑時,必須將 NSString 轉換為 UTF8 字符串:

NSString *fullPath = [documentPath stringByAppendingPathComponent:@"myFile.txt"];
File *f = fopen(fullPath.UTF8String, "r");

請注意, fopen() C 函數需要傳遞到所需文件的絕對路徑才能打開它。

如果fopen()返回 NULL,您可以通過檢查errno的錯誤號和strerror()函數(from )來檢查出了什么問題,以獲得人類可讀的解釋:

#include <stdio.h>
#include <errno.h>
#include <string.h>

File *fileHandler = fopen( fullPathToFileAsUTF8String, openMode );
if( fileHandler == NULL ) {
    fprintf(stderr, "File open error: %s\n", strerror(errno));
}

我認為您第一次嘗試的問題在於您將 URL 傳遞給需要路徑的庫函數。 嘗試:

NSURL *docs = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
NSString *docsPath = docs.path;
const char *dir = [docsPath UTF8String];
myLibraryEntryPoint(dir,(int)[docsPath length]);

遇到了類似的問題。 我有一個 C 庫,我需要從中讀寫文件。

我編寫了下面的代碼來查找應用程序的 Documents 文件夾的路徑:

char path[256] = {0};
strcpy(path, getenv("HOME"));
strcpy(path, "/Documents/file.txt");
FILE *file = fopen(path, "r");

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM