[英]Hex file reading in C programming?
我有一個問題:
我正在編寫一個功能很像十六進制編輯器的ac程序。 我想獲取一個文件並查看其十六進制值。 例如,假設我有一個文本文件“ helloworld.txt”,其中僅帶有單詞“ Hello World!”。 在其中,我想指定程序使用該文件,讀取其十六進制值(同樣,該文件是簡單的.txt文件,而不是二進制文件),並將其存儲在數組中以備后用。
這是我到目前為止的內容:
#include <stdio.h>
#include <stdlib.h>
int main()
{
char ch, file_name[25];
FILE *fp;
printf("Enter the name of file you wish to see\n");
gets(file_name);
fp = fopen(file_name,"rb"); // read binary mode
if( fp == NULL ) //error checking
{
perror("Error while opening the file.\n");
exit(EXIT_FAILURE);
}
printf("The contents of %s file are :\n", file_name);
while( ( ch = fgetc(fp) ) != EOF )
printf("%c",ch);
fclose(fp);
return 0;
}
如您所見,這實際上只是一個簡單的文件,可以讀取和打印內容。 但是,問題是,即使我處於“讀取二進制”模式,它也不會給我文本文件的十六進制值。
我如何構造該程序,以便它讀取標准文本文件的十六進制值,然后(a)將它們放入數組(我認為使用for循環應該足夠簡單)或(b)將它們打印到屏幕?
我嘗試使用谷歌搜索功能來查看其他人是否正在嘗試執行相同的操作,但是人們要么已經在從二進制文件中讀取文件,要么已經在文件中具有十六進制值。 我在常規.txt文件中有純文本,但我想在其下面使用十六進制值(換句話說,就是文件的十六進制轉儲)。 我希望我的問題和我想做的事情有意義。 如果您有任何疑問,請隨時告訴我! 預先感謝您的所有幫助! 我真的很感激!
不知道我是否正確理解了這個問題,但不是簡單地使用(針對選項B)的情況
printf("0X%02x ", ch);
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char **argv)
{
FILE *fd;
long filesize;
char *buffer, *it;
if ((fd = fopen(argv[1], "rb")) == NULL) {
perror("Error opening file");
return EXIT_FAILURE;
}
fseek(fd, 0, SEEK_END);
filesize = ftell(fd);
rewind(fd);
buffer = (char *) malloc(sizeof(char) * filesize+1);
if (fread(buffer, sizeof(char), filesize, fd) != filesize) {
fprintf(stderr, "Error reading file\n");
return EXIT_FAILURE;
}
buffer[filesize] = '\0';
for (it = buffer; *it != '\0'; it++)
printf("%02X ", *it);
free(buffer);
return EXIT_SUCCESS;
}
你好親近
注意兩件事:
1-使用fgets()代替gets()。
2- printf(“%02X”,ch);
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char ch, file_name[25];
FILE *fp;
printf("Enter the name of file you wish to see\n");
fgets(file_name, sizeof(file_name), stdin);
file_name[strlen(file_name)-1] = 0x00;
fp = fopen(file_name,"rb"); // read binary mode
if( fp == NULL ) //error checking
{
perror("Error while opening the file.\n");
exit(EXIT_FAILURE);
}
printf("The contents of %s file are :\n", file_name);
int i;
while( ( ch = fgetc(fp) ) != EOF )
{
printf("%02X ",ch);
if( !(++i % 16) ) putc('\n', stdout);
}
fclose(fp);
putc('\n', stdout);
return 0;
}
當然,這只是打印到標准輸出。 如果要將結果放入數組,則可以使用sprintf()
類的東西將輸出放入某些緩沖區。
輸出示例:
jrn@mint17 ~ $ ./a.out
Enter the name of file you wish to see
hex_for_so.c
The contents of hex_for_so.c file are :
23 69 6E 63 6C 75 64 65 20 3C 73 74 64 69 6F 2E
68 3E 0A 23 69 6E 63 6C 75 64 65 20 3C 73 74 64
6C 69 62 2E 68 3E 0A 23 69 6E 63 6C 75 64 65 20
3C 73 74 72 69 6E 67 2E 68 3E 0A 0A 69 6E 74 20
6D 61 69 6E 28 29 0A 7B 0A 20 20 20 63 68 61 72
20 63 68 2C 20 66 69 6C 65 5F 6E 61 6D 65 5B 32
35 5D 3B 0A 20 20 20 46 49 4C 45 20 2A 66 70 3B
0A 0A 20 20 20 70 72 69 6E 74 66 28 22 45 6E 74
65 72 20 74 68 65 20 6E 61 6D 65 20 6F 66 20 66
69 6C 65 20 79 6F 75 20 77 69 73 68 20 74 6F 20
73 65 65 5C 6E 22 29 3B 0A 20 20 20 66 67 65 74
73 28 66 69 6C 65 5F 6E 61 6D 65 2C 20 73 69 7A
65 6F 66 28 66 69 6C 65 5F 6E 61 6D 65 29 2C 20
73 74 64 69 6E 29 3B 0A 20 20 20 66 69 6C 65 5F
6E 61 6D 65 5B 73 74 72 6C 65 6E 28 66 69 6C 65
5F 6E 61 6D 65 29 2D 31 5D 20 3D 20 30 78 30 30
3B 0A 0A 20 20 20 66 70 20 3D 20 66 6F 70 65 6E
28 66 69 6C 65 5F 6E 61 6D 65 2C 22 72 62 22 29
3B 20 2F 2F 20 72 65 61 64 20 62 69 6E 61 72 79
20 6D 6F 64 65 0A 0A 20 20 20 69 66 28 20 66 70
20 3D 3D 20 4E 55 4C 4C 20 29 20 2F 2F 65 72 72
6F 72 20 63 68 65 63 6B 69 6E 67 0A 20 20 20 7B
0A 20 20 20 20 20 20 70 65 72 72 6F 72 28 22 45
72 72 6F 72 20 77 68 69 6C 65 20 6F 70 65 6E 69
6E 67 20 74 68 65 20 66 69 6C 65 2E 5C 6E 22 29
3B 0A 20 20 20 20 20 20 65 78 69 74 28 45 58 49
54 5F 46 41 49 4C 55 52 45 29 3B 0A 20 20 20 7D
0A 0A 20 20 20 70 72 69 6E 74 66 28 22 54 68 65
20 63 6F 6E 74 65 6E 74 73 20 6F 66 20 25 73 20
66 69 6C 65 20 61 72 65 20 3A 5C 6E 22 2C 20 66
69 6C 65 5F 6E 61 6D 65 29 3B 0A 0A 20 20 20 69
6E 74 20 69 3B 0A 20 20 20 77 68 69 6C 65 28 20
28 20 63 68 20 3D 20 66 67 65 74 63 28 66 70 29
20 29 20 21 3D 20 45 4F 46 20 29 0A 20 20 20 7B
0A 20 20 20 20 20 20 70 72 69 6E 74 66 28 22 25
30 32 58 20 22 2C 63 68 29 3B 0A 09 20 20 69 66
28 20 21 28 2B 2B 69 20 25 20 31 36 29 20 29 20
70 75 74 63 28 27 5C 6E 27 2C 20 73 74 64 6F 75
74 29 3B 0A 20 20 20 7D 0A 20 20 20 66 63 6C 6F
73 65 28 66 70 29 3B 0A 20 20 20 72 65 74 75 72
6E 20 30 3B 0A 7D 0A
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.