#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
, потому что achar
уже закодировано таким образом,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().