2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 Помогите пожалуйста! Нужно прочесть весь файл в строку.
Сообщение07.06.2009, 19:16 


16/11/08
16
Казахстан
Здравствуйте, уважаемые товарищи форумчане.
Есть к вам такая небольшая, значит, просьба.
Нужно прочесть весь файл в строку.
Пишем программу.
void main()
{ FILE *file;
char* file_name = "C:/zippo.mt7";
char load_string[999] = "";

file = fopen(file_name, "rb+");
char* A=fgets( load_string, 90 , file );
cout<<load_string<<"\n"<<"\n";
fclose(file);
}
Но Cout выводит только первые пять символов, MTP7A, а надо больше. Как сделать чтобы читало все?

 Профиль  
                  
 
 Re: Помогите пожалуйста! Нужно прочесть весь файл в строку.
Сообщение07.06.2009, 20:00 
Заслуженный участник


28/04/09
1933
Скорее всего, у Вас шестым по счету символом в файле идет какой-нибудь символ, который воспринимается функцией fgets как конец строки (нулевой символ или возврат каретки). Возможен более изощренный вариант: fgets считывает строку правильно, но оператор вывода выводит ее до первого нулевого. На мой взгляд, лучше воспользоваться другой операцией ввода (хотя бы элементарным fscanf'ом). Это самое простое.

 Профиль  
                  
 
 Re: Помогите пожалуйста! Нужно прочесть весь файл в строку.
Сообщение08.06.2009, 08:18 
Аватара пользователя


19/05/09
53
Москва
Ну, этот код в любом случае не сможет прочитать ВЕСЬ файл в строку, как заявлено в условии - он умеет читать только самую первую строку.
Из этого следует, что после этих первых 5 символов у вас стоит конец строки, потому на этом и "обрывается" считывание файла.

Уточните, пожалуйста, условие задачи, чтобы я мог Вам помочь.

p.s.: cout вполне можно заместить на printf() или другую подобную функцию - лучше не использовать C++ ради одной строчки, где можно с ничуть не меньшим удобством использовать чистый Си.
Также хочется уточнить, зачем нужен участок кода "char* A".
Кстати, обязательно ли использовать rb+? Используя его, вы заявляете, что хотите открыть двоичный файл для чтения и записи, но скорее всего Вы хотите открыть обычный текстовый файл только для чтения (r), ну либо если всё же двоичный, то rb.

А пока задача не уточнена, предложу Вам переписать Ваш код переписать в таком виде:
Код:
#include <stdio.h>

#define BUF_SIZE 90

void main()
{
   FILE *file;
   char *file_name = "C:/zippo.mt7";
   char buffer[BUF_SIZE];

   file = fopen(file_name, "r");
   fgets(buffer, sizeof(buffer), file);
   printf("%s\n\n", buffer);
   fclose(file);
}


Такое "извращение" над fgets() проведено ради того, чтобы защитить её от переполнения буфера, что с ней происходит буквально постоянно.
Тем не менее, лучше избегать использование функции fgets() - причину см. выше.

 Профиль  
                  
 
 Re: Помогите пожалуйста! Нужно прочесть весь файл в строку.
Сообщение11.06.2009, 00:08 


16/11/08
16
Казахстан
Хочу уточнить условие задачи.
Признаюсь,ошибки в коде той программы есть и ях не скрываю, т.к. не являюсь профессиональным програмистом на си. Поэтому снова нуждаюсь в Вашей всеохватывающей помощи).
Файл нужно прочитать полностью в одну большую строчку. Символы MTP7A и прочие замечательные последовательности нужно вообще опустить. То что останется - нужно преобразовать в одномерный массив 4-байтных float'ов (т.е. стандартный массив float-значений).
При этом хекс желательно загружать не как Integer, т.е. FFFFFFFF должно предоставляться НЕ целым числом (FFFFFFFF будет 4 миллиарда 294 миллиона и т.д. т.п.) а именно загружаться в стэк FPU именно как есть. То есть самый старший бит - знак, потом экспонента, и затем мантисса - битфилд выглядит так:
31 30 23 22 0
+----+--------+------------------+
|Sign|Exponent|Fraction(Мантисса)|
+----+--------+------------------+
Где под знак отводится старший (32-й, если считать с первого) бит,
Экспоненту - 8 бит, и наконец мантиссу остальные 23 бита.
Т.е. в FPU не должно загружаться целочисленное значение, его нужно загрузить "as is".
Вы можете сказать зачем нужно решать такую сложную инженерную задачу...

Просто затем эти числа должны быть представлены как координаты для построения трехмерных треугольников в трехмерном пространстве.
т.е. должна осуществиться обратная операция, помещение числа в FPUL с соотвествующим корректным преобразованием.
Таким образом два вопроса: как создать такой массив из файла и как преобразовать числа в правильные float.

 Профиль  
                  
 
 Re: Помогите пожалуйста! Нужно прочесть весь файл в строку.
Сообщение11.06.2009, 00:31 


02/07/08
322
Я, возможно, неправильно понимаю, что вам нужно, но кажется, что вам нужно смотреть в сторону работы с бинарными файлами. Открытие файла в бинарном режиме предполагает, что мы на него смотрим не как на текст, а как на набор байт, заканчивающийся специальным символом конца файла. При этом читать его можно в любом удобном формате. Можно прочитать один байт - в переменную типа char, можно несколько байт подряд - в переменную типа char*. А если вы знаете, что в файле записано число типа float, причём записано в нужном формате (например, если кто-то до этого это число записал в файл в бинарном режиме), то можно прочитать и float, и никаких преобразований не понадобится.
Если это то, что нужно, то яндекс "бинарные файлы c++" или гугл "c++ binary files" в помощь.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 5 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group