我正在尝试在C中打开一个名为test的简单.rtf文件。我正在使用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目录相同的目录中。我的输出是“文件打开成功”,但我没有从文件中读取任何内容。我这样做了吗?感谢。
答案 0 :(得分:1)
该代码完全没有问题。我用文件测试了它(虽然不是在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中经常发生,因为程序运行的目录并不总是开发人员首先想到的。)
答案 1 :(得分:0)
看起来不错。
至于缺乏产出,有两种可能性:
ls -l test.rtf
或dir test.rft
答案 2 :(得分:0)
尝试将test.rtf
移动到您的构建目录。如果您的项目名为MyProject
,请将其移至MyProject/build/Debug/
。
答案 3 :(得分:0)
我可以想到两件可能导致这个问题的事情。调用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 \ viewkind0 \ PARD \ tx720 \ tx1440 \ tx2160 \ tx2880 \ tx3600 \ tx4320 \ tx5040 \ f0 \ fs24 \ cf0您好。 。 。
你只是假设这是GDB输出,而不是程序的输出。
答案 4 :(得分:0)
根据您最近的评论,我认为您的程序运行目录中有一个空文件test.rtf
,而您的真实test.rtf
文件位于其他目录中。也许您fopen()
的某个时间点fopen("test.rtf", "w");
来电是fopen("test.rtf", "r");
而不是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>
然后,你可以打开一个终端,做{{1}},并自行测试你想要的文件是你的程序正在打开的文件。
答案 5 :(得分:0)
您可能希望此文件是纯文本,而不是富文本。富文本有很多格式编码到文件中。