繁体   English   中英

帮助在Xcode上的C中打开文件

[英]Help with opening a file in C on Xcode

我正在尝试在C中打开一个简单的.rtf文件,称为test。我正在使用Xcode。 我的代码是:

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

int main (int argc, const char * argv[]) {

    FILE *filePtr;
    filePtr = fopen("test.rtf", "r");
    if (filePtr == NULL) {
        fprintf(stderr, "Can't open \"test\"\n");
        exit(EXIT_FAILURE);
    }
    else {
        printf("File open successful\n");
        int x;
        /* read one character at a time until EOF is reached */
        while ((x = fgetc(filePtr)) != EOF) {
            printf("%c", x);
        }
    }
    fclose(filePtr);
    return 0;   
}

我的test.rtf文件与Xcode.proj目录位于同一目录中。 我的输出是“文件打开成功”,但是我没有从文件中读取任何内容。 我这样做对吗? 谢谢。

该代码完全没有错。 我用一个文件对其进行了测试(尽管不是在Xcode中),并且成绩单是:

pax> echo hello >test.rtf
pax> ./qq.exe
File open successful
hello

因此,显而易见的问题是,当您检查test.rtf时会发生什么? 它实际上有内容吗? 因为,当我这样做时:

pax> rm test.rtf ; touch test.rtf
pax> ./qq.exe
File open successful

我得到的行为与您观察到的相同。

另外,尝试暂时将其重命名为test2.rtf,并确保您得到此错误。 可能打开的文件副本与您想象的不同(在Visual C中经常发生这种情况,因为程序运行的目录并不总是开发人员一开始的想法)。

看起来不错。

至于缺少输出,有两种可能性:

  • 您确定文件中有内容吗? 也许ls -l test.rtfdir test.rft
  • 它可能具有某些控制字符,这会导致所写入的端子抑制输出。

尝试将test.rtf移至构建目录。 如果您的项目名为MyProject ,请将其移至MyProject/build/Debug/

我可以想到可能导致此问题的两件事。 调用fgetc时出现错误,或者获取的输出无法识别。

到达文件末尾或发生错误时,fgetc()将返回EOF。 要确定是否是错误,请在while循环之后尝试:

if (ferror(filePtr) != 0) printf("error: %d.\\n", errno);

.rtf文件不是纯文本文件。 它可能包含一堆格式信息。 您期望看到“您好……”。 但是您可能实际看到的是:

{\\ rtf1 \\ ansi \\ ansicpg1252 \\ cocoartf1038 \\ cocoasubrtf250 {\\ fonttbl \\ f0 \\ fswiss \\ fcharset0 Helvetica;} {\\ colortbl; \\ red255 \\ green255 \\ blue255;} \\ margl1440 \\ margr1440 \\ vieww9000 \\ viewh8400 \\ viewkind0par tx1440 \\ tx2160 \\ tx2880 \\ tx3600 \\ tx4320 \\ tx5040 \\ f0 \\ fs24 \\ cf0您好。

您只是假设这是GDB输出,而不是程序的输出。

根据您最近的评论,我认为您的程序运行所在的目录中有一个空文件test.rtf ,而实际的test.rtf文件位于其他目录中。 也许某个时候您的fopen()调用是fopen("test.rtf", "w"); 而不是fopen("test.rtf", "r"); ,然后您对其进行了修改。

要查看程序正在运行的目录,请在FILE *filePtr;之后将以下内容添加到您的程序中FILE *filePtr; 线:

char pwd[512];
if (getcwd(pwd, sizeof pwd) != -1)
    printf("In directory %s\n", pwd);
else
    fprintf(stderr, "Need bigger buffer, change '512' above\n");

然后,您可以打开一个终端,执行cd <directory> ,并自己测试所需的文件是否是程序正在打开的文件。

您可能希望此文件是纯文本,而不是富文本。 富文本格式有很多格式编码到文件中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM