yagami_md Ответов: 3

Проблема с записью в файл на языке Си


привет друзья
когда я читаю только 64 байта из файла изображения я вижу что программа пишет странный байт :
P5
# Создается imlib, которые
512 512
255
¢¢¢¡¢£¡¦¢¢ "£ "œ¡¡šœš ќ™ќ šœšÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ..
почему программа пишет байтесс""""""????

Что я уже пробовал:

//while (!feof(file))  // repeat until reached end of file

{	
	char *filename="temp_file()";

	pFile=fopen(filename,"wb");

    int index;	// index into the buffer

    numread = fread(buffer, sizeof(unsigned char), 64, fpIn);

    if (numread == 0)

        break;  // no data left to read

    for (index = 0; index < numread; ++index)

    {
        // process each byte of the buffer

        char b = buffer[index];	// b contains the value of the current byte

        //printf("byte %d: %c\", index, b);

		fprintf(pFile,"%c",b);
		
    }

3 Ответов

Рейтинг:
9

manoranjan

Одной из причин может быть то, что символы находятся в самом файле изображения :)

Символы присваиваются неинициализированным переменным в отладочной сборке.
Как вы определили буфер? Если вы определили buffer как int (или short), вы получите эти символы в debug build, потому что:
i) Вы читаете массив байтов в буфере.
ii) вы записываете каждый 4-й байт (из буфера) в файл.

Это должно сработать, если вы измените буфер на char.


yagami_md

извини, брат, я перешел на char, но не на работу !!! что я буду должен делать

manoranjan

Пожалуйста, поделитесь обновленным кодом и новым выводом.

yagami_md

Это ошибка положения файла fclose

Рейтинг:
21

OriginalGriff

Просто: это двоичные данные, поэтому они не содержат читаемой человеком информации.
Некоторые двоичные данные могут быть удобочитаемыми для человека - например, часть " создано ... "в вашем примере, - но остальные нет, поэтому, когда вы пытаетесь отобразить их, лучше всего" перевести "байты в"читаемые символы". Однако они не могут использоваться в качестве данных!


yagami_md

что надо делать чтобы не написать "ÍÍÍÍÍÍÍ.." байт????

Leo Chapiro

Вам нужно читать текстовый файл, а не картинку!

yagami_md

я думаю, что "фпринтф" так и сделает !!! запишите 64 байта в файл " temp_file()"

Leo Chapiro

Разве вы не сказали: "когда я читаю ... из файла изображения"? Что это за файл?

yagami_md

да изображения.ПГМ

OriginalGriff

Файлы PGM не содержат текста - они содержат двоичные данные.
Это означает, что если вы опустите (или даже измените) один байт, файл может легко стать непригодным для использования.
Поэтому начните с того, что не используйте значения char - вместо этого используйте unsigned char (или byte, если он определен для вас). Unsigned char - это 8-битное значение, char-это 7-битное значение со знаком.

Leo Chapiro

Хорошо, теперь я понимаю ваш вопрос: PGM - это файл изображения в оттенках серого, закодированный одним или двумя байтами (8 или 16 бит) на пиксель; содержит информацию заголовка и сетку чисел, представляющих различные оттенки серого от черного (0) до белого (до 65 536); обычно хранится в текстовом формате ASCII, но также имеет двоичное представление.

Вы хотите читать только часть файла ASCI?

yagami_md

да я хочу читать только ASCII ! например, когда я открывал изображение с помощью блокнота или блокнота

Рейтинг:
18

Leo Chapiro

Взгляните на это решение в C++, похоже, то же самое, что вы хотите сделать. Вы можете адаптировать его к языку Си:

синтаксический анализ - Как читать данные из файла pgm в C++ - переполнение стека[^]

#include <iostream> // cout, cerr
#include <fstream> // ifstream
#include <sstream> // stringstream
using namespace std;

int main() {
  int row = 0, col = 0, numrows = 0, numcols = 0;
  ifstream infile("file.pgm");
  stringstream ss;
  string inputLine = "";

  // First line : version
  getline(infile,inputLine);
  if(inputLine.compare("P2") != 0) cerr << "Version error" << endl;
  else cout << "Version : " << inputLine << endl;

  // Second line : comment
  getline(infile,inputLine);
  cout << "Comment : " << inputLine << endl;

  // Continue with a stringstream
  ss << infile.rdbuf();
  // Third line : size
  ss >> numcols >> numrows;
  cout << numcols << " columns and " << numrows << " rows" << endl;

  int array[numrows][numcols];

  // Following lines : data
  for(row = 0; row < numrows; ++row)
    for (col = 0; col < numcols; ++col) ss >> array[row][col];

  // Now print the array to see the result
  for(row = 0; row < numrows; ++row) {
    for(col = 0; col < numcols; ++col) {
      cout << array[row][col] << " ";
    }
    cout << endl;
  }
  infile.close();
}