Последовательная функция fwrite() не дает желаемого результата

#c

#c

Вопрос:

Итак, у меня есть следующий код, с которым я играю:

 #includelt;stdio.hgt; #includelt;stdlib.hgt; #includelt;string.hgt;  int main (int argc, char* argv[]) {   FILE* fp;  char c, currentchar;  int flag = 0, count = 1;   if (argc lt; 2) {  printf("wzip:insufficient argsn");  exit(1);  }  fp = fopen(argv[1], "r");   while ( fread(amp;c, sizeof(char), 1, fp) == 1) {  if (flag == 1) {  if (c == currentchar) {    count;  }  else {  fwrite(amp;currentchar, sizeof(char), 1, stdout);  //printf("%d", count);  fwrite(amp;count, sizeof(int), 1, stdout);  currentchar = c;  count = 1;  }  }  if (flag == 0) {  currentchar = c;  flag = 1;  }  }  printf("n");  return 0; }  

Приведенный выше код не предоставляет мне выходные данные второй функции fwrite () (которая использует переменную count). Я предполагаю, что это проблема, связанная со сбросом потока, но я не могу ее решить. Любая помощь была бы великолепна!

E: для примера ввода/вывода предположим, что у меня есть файл test.1 , в котором есть буквы sssaa .

Если я запущу ./wzip test.1 вывод будет:

sa

в то время как в идеале это должно быть:

s3a2

Комментарии:

1. Пожалуйста, предоставьте образец ввода и ожидаемый результат.

2. Вы пишете необработанное двоичное представление count , а не его значение в печатной форме. Если вы хотите написать текст, используйте соответствующие функции вывода текста (например fprintf ,).

3. fwrite может использоваться для отображения одного char , потому что a char уже закодировано таким образом, stdout чтобы его можно было понять. С int другой стороны, перед отображением его необходимо преобразовать в строку цифр stdout . Вот что printf("%d", count) делает. Он преобразует символы int в цифры и отправляет цифры на stdout .

4. Также fwrite предназначен для вывода файлов, а не терминала.

5. Вы можете использовать fprintf для записи целого числа в stdout.

Ответ №1:

 #includelt;stdio.hgt; #includelt;stdlib.hgt; #includelt;string.hgt;  int main (int argc, char* argv[]) {   FILE* fp;  char c, currentchar;  int flag = 0, count = 1;   if (argc lt; 2) {  printf("wzip:insufficient argsn");  exit(1);  }  fp = fopen(argv[1], "r");   while ( fread(amp;c, sizeof(char), 1, fp) == 1) {  if (flag == 1) {  if (c == currentchar) {    count;  }  else {  fwrite(amp;currentchar, sizeof(char), 1, stdout);  //printf("%d", count);  fprintf(stdout, "%i", count); /* this one */  currentchar = c;  count = 1;  }  }  if (flag == 0) {  currentchar = c;  flag = 1;  }  }  printf("n");  fclose(fp);  return 0; }   

Проверено «tcc». Ваш fwrite(amp;count, sizeof(int), 1, stdout); напишите в stdout не «3», а 0x03 — см. Коды ANSII . Вы можете проверить это, если позвоните с перенаправлением и проверьте вывод.файл hexviewer. Что-то вроде «wzip-теста.1 gt; out.txt’

Комментарии:

1. Я на самом деле хочу получить необработанное двоичное представление count . Это главная причина, по которой я использую fwrite() в первую очередь. Я полагаю fprintf() , что это не обеспечивает того же самого?

2. Я думаю, что ОП хочет использовать fwrite именно это.

3. Да, @OzgurBagci прав. Мне не нужен способ заставить эту программу работать. Я хочу понять, что не так с использованием fwrite() дважды. Пожалуйста, воздержитесь от предложений printf() и подобных вещей. Я знаю, как это сделать. Я хочу знать, как войти в систему, не используя fwrite() , т. е. сохраняя двоичную форму.

4. @Srijan-Sriv, вы должны преобразовать двоичное значение ‘int’ (‘короткий’, ‘символ’) в представление ascii. Используйте itoa() из stdlib.h или сделайте это самостоятельно. Также смотрите источники «stdlib», как это работает в fprintf().