2012-02-24 3 views
2

У меня есть файл, который я хочу прочитать и распечатать на экране. Я использую XCode в качестве моей IDE. Вот мой код ...fread() помещает странные вещи в массив символов

fp=fopen(x, "r"); 
char content[102]; 
fread(content, 1, 100, fp); 
printf("%s\n", content); 

Содержимое файла: "Bacon!" Распечатывается \254\226\325k\254\226\234.

У меня есть Google Googled на всем протяжении этого ответа, но документация для ввода/вывода файлов в C кажется редкой, и мало что там не очень ясно. (Мне по крайней мере ...)

EDIT: Я переключился на чтение, а не на добавление и чтение, и переключил два средних аргумента в fread(). Теперь он печатает Bacon!\320H\320 Что это значит? Вещи, как в номере с обратной косой чертой номер или буква. Я также переключил способ распечатать его, как было предложено.

+0

Что в файле? – Dani

+1

Никогда не используйте строку формата, считываемую из любого места!. В этом случае используйте 'puts()' или 'printf ("% s ", content)' – ydroneaud

+0

@ Дани, вопрос говорит вам, что это «Бэкон!». Вы сомневались в силе бекона? – CoffeeRain

ответ

9

Вы открываете файл для добавляющих и чтения. Вы должны открыть его для , читающего, или перемещая указатель чтения к месту, из которого вы собираетесь читать (начало, я полагаю).

FILE *fp = fopen(x, "r"); 

или

FILE *fp = fopen(x, "a+"); 
rewind(fp); 

Кроме того, fread(...) не нулевой прекратить вашу строку, так что вы должны прекратить его перед печатью:

size_t len = fread(content, 1, 100, fp); 
content[len] = '\0'; 
printf("%s\n", content); 
+0

'' a + "' означает добавление _and_ чтения. –

+0

a + открывает его для чтения и добавления (согласно моей локальной странице man), который должен читать файл с самого начала ... (Я узнал что-то сегодня!) – vmpstr

+0

@JoachimPileborg Хорошо, я обновил ответ, чтобы отразить это. Благодаря! – dasblinkenlight

2

Я полагаю, вы имели в виду это:

printf("%s\n", content); 
0

Возможная причина заключается в том, что вы не прекратить считываемые данные, так printf печатает буфер до тех пор, пока не найдет строку терминатор.

1

Может быть:

fp = fopen(x, "a+"); 
if(fp) 
{ 
    char content[102]; 
    memset(content, 0 , 102); 

    // arguments are swapped. 
    // See : http://www.cplusplus.com/reference/clibrary/cstdio/fread/ 
    // You want to read 1 byte, 100 times 
    fread(content, 1, 100, fp); 

    printf("%s\n", content); 
}