如何从现有的文本文件创建二进制文件?
在本文中,我们将讨论如何从给定的文本文件创建二进制文件。在进行步骤之前,让我们先介绍一下什么是文本文件和二进制文件。
文本文件:文本文件以人类可读的形式和顺序存储数据。
二进制文件:二进制文件以位/位组(字节)的形式依次存储数据。这些位的组合可以参考自定义数据。二进制文件可以存储多种类型的数据,例如图像、音频、文本等。
问题陈述:这里的任务是从文本文件中读取数据,并以二进制形式创建一个包含相同数据的新二进制文件。
示例:假设在一个名为“Custdata.txt”的文件中有客户的详细信息,任务是通过从文本文件“Custdata.txt”中读取数据来创建一个名为“Customerdb”的二进制文件。
- 文件“Custdata.txt”的每一行都包含一个客户信息的记录。
- 一条记录有 3 个属性,即ID 、 Name和Age 。
- 每条记录都有固定的长度。
让我们假设“Custdata.txt”具有以下数据-ID Name Age 1 Annil 22 2 Ram 45 3 Golu 25
- 让记录大小,记录中的字节数= B 。
- 如果将3 个客户的数据写入磁盘文件,则该文件将包含3 × B 字节。
- 如果文件中有客户记录相对位置pos的信息,则可以直接读取客户信息。
- pos* (B – 1)将是记录的起始字节位置。
因此,没有要求以文本格式将所有值存储在记录中。内部格式可用于直接存储值。 一个好的并且可以作为选择的选项是为我们的记录定义一个结构。
struct Customers
{
int ID;
char name[30];
int age;
}
现在可以通过创建结构变量 cs 来访问结构客户的各个元素:
- cs.ID。
- cs.name。
- cs.age。
让我们看看读取文本文件和写入二进制文件所需的方法。读取所需的函数是 fscanf(),写入所需的函数是 fwrite()。
阅读: fscanf() 函数用于读取包含客户数据的文本文件。
句法:
int fscanf(FILE* streamPtr, const char* formatPtr, …);
This function reads the data from file stream and stores the values into the respective variables.
fscanf() 的参数:
- streamPtr:它指定指向要从中读取数据的输入文件流的指针。
- formatPtr:指向指定如何读取输入的以空字符字符串的指针。它由以 % 开头的格式说明符组成。示例: %d 表示 int , %s 表示字符串等。
使用这个函数需要包含
写作: fwrite() 程序中使用函数将文本文件中读取的数据以二进制形式写入二进制文件。
句法:
size_t fwrite(const void * bufPtr, size size, size_t count, FILE * ptr_OutputStream);
The fwrite() function writes “count” number of objects, where size of every object is “size” bytes, to the given output stream.
write() 的参数:
- bufPtr:指向写入内容的内存块的指针(转换为const void*)。
- size:要写入的每个对象的大小(以字节为单位)。
- count:要读取的对象总数。
- ptr_OutputStream:指向指定要写入的输出文件流的文件的指针。
使用此函数需要包含
算法:下面是程序读取文本文件并将二进制形式的内容写入二进制文件的方法。
- 打开输入文本文件和输出二进制文件。
- 直到到达文本文件的末尾,执行以下步骤:
- 使用fscanf()将输入文本文件中的一行读入 3 个变量。
- 结构变量设置为元素的值(将结构变量写入输出文件。
- 使用fwrite()将该结构变量写入输出二进制文件。
- 关闭输入文本文件和输出二进制文件。
以下是上述方法的 C++ 程序:
C++
// C++ program for the above approach
#include
#include
#include
using namespace std;
// Creating a structure for customers
struct Customers {
int ID;
char name[30];
int age;
};
// Driver Code
int main()
{
struct Customers cs;
int rec_size;
rec_size = sizeof(struct Customers);
cout << "Size of record is: "
<< rec_size << endl;
// Create File Pointers fp_input for
// text file, fp_output for output
// binary file
FILE *fp_input, *fp_output;
// Open input text file, output
// binary file.
// If we cannot open them, work
// cannot be done, so return -1
fp_input = fopen("custdata.txt", "r");
if (fp_input == NULL) {
cout << "Could not open input file"
<< endl;
return -1;
}
fp_output = fopen("Customerdb", "wb");
if (fp_output == NULL) {
cout << "Could not open "
<< "output file" << endl;
return -1;
}
// Read one line from input text file,
// into 3 variables id, n & a
int id, a;
char n[30];
// Count for keeping count of total
// Customers Records
int count = 0;
cout << endl;
// Read next line from input text
// file until EOF is reached
while (!feof(fp_input)) {
// Reading the text file
fscanf(fp_input, "%d %s %d ",
&id, n, &a);
// Increment the count by one
// after reading a record
count++;
// Structure variable cs is set
// to values to elements
cs.ID = id, strcpy(cs.name, n), cs.age = a;
// Write the structure variable
// cs to output file
fwrite(&cs, rec_size, 1, fp_output);
printf(
"Customer number %2d has"
" data %5d %30s %3d \n",
count, cs.ID,
cs.name, cs.age);
}
cout << "Data from file read"
<< " and printed\n";
cout << "Database created for "
<< "Customers info\n";
// Count contains count of total records
cout << "Total records written: "
<< count << endl;
// Close both the files
fclose(fp_input);
fclose(fp_output);
return 0;
}
输出:
Size of record is: 40
Customer number 1 has data 1 Annil 22
Customer number 2 has data 2 Ram 45
Customer number 3 has data 3 Golu 25
Data from file read and printed
Database created for Customers info
Total records written: 3
说明: “custdata.txt”文件中有3条记录被读取、打印并以二进制方式保存在“Customerdb”文件中。
文本文件的每行包含 3 个字段 - ID、名称和年龄。
文本文件的第一行包含-
1 Annil 22
从文件中读取这一行,即读取ID、Name和Age的数据,并将它们的值分别赋给变量id、n和a。现在将这 3 个变量的值分别赋给数据成员:ID、name[] 和结构变量 cs 的年龄。
现在使用fwrite(&cs, rec_size, 1, fp_output) ,将一个大小为 rec_size 的 cs 对象写入二进制文件——“fp_output”(二进制模式)。
此过程对文本文件的所有行继续进行,直到到达文件末尾。程序执行结束后,文件“custdata.txt”将保持原样,因为它是在读取模式下打开的——
1 Annil 22
2 Ram 45
3 Golu 25
该数据被逐行读取并以二进制模式写入文件“Customerdb”。文件“Customerdb”将包含二进制形式的内容,这是不可读的。该文件在正常打开时如下所示: