Помогите с открытием файла в C на Xcode - PullRequest
0 голосов
/ 13 января 2010

Я пытаюсь открыть простой файл .rtf с именем test в C. Я использую 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. Мой вывод «Файл успешно открыт», однако я не получаю ничего прочитанного из файла. Я делаю это правильно? Спасибо.

Ответы [ 6 ]

1 голос
/ 13 января 2010

В этом коде нет ничего плохого. Я проверил это (хотя и не в 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, поскольку каталог, в котором запускается программа, не всегда является тем, о чем сначала думают разработчики).

0 голосов
/ 07 февраля 2010

Возможно, вы хотите, чтобы этот файл был обычным текстом, а не форматированным текстом. Форматированный текст имеет много форматирования, закодированного в файл.

0 голосов
/ 15 января 2010

Основываясь на ваших последних комментариях, я думаю, что у вас есть пустой файл 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> и проверить для себя, является ли файл, который вы хотите, файлом, который открывает ваша программа.

0 голосов
/ 13 января 2010

Я могу вспомнить две вещи, которые могут вызвать эту проблему. Либо есть ошибка при вызове 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 \ Пард \ tx720 \ tx1440 \ tx2160 \ tx2880 \ tx3600 \ tx4320 \ tx5040 \ f0 \ fs24 \ cf0 Привет. , ,

И вы просто предполагаете, что это вывод GDB, а не вывод вашей программы.

0 голосов
/ 13 января 2010

Попробуйте переместить test.rtf в каталог сборки. Если ваш проект называется MyProject, переместите его на MyProject/build/Debug/.

0 голосов
/ 13 января 2010

выглядит правильно.

Что касается отсутствия выхода, две возможности:

  • Вы уверены, что файл имеет некоторый контент? Может быть ls -l test.rtf или dir test.rft
  • Возможно, у него есть некоторые управляющие символы, которые приводят к тому, что терминал, на который оно записано, подавляет вывод.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...