本质上,我使用 fseek() 和 fwrite() 打印到二进制文件。但是,我想将特定行的内容读入结构中。我还使用 fseek() 和 fread() 来获取内容。我提示用户输入代码。根据我所了解到的,我将使用从用户获得的值在 fseek 函数中使用来获取要开始读取的特定行。显然,读取内容的 fseek 不起作用,当它显示在屏幕上时,我基本上得到了乱码。非常感谢您的帮助。
#include <conio.h>
#include <stdio.h>
typedef struct registered
{
int compcode;
char compname[20];
int pinID;
int custID;
char IDtype[15];
int compID;
}REGISTERED;
void AddUpdate(REGISTERED info);
void SellPetrol();
void main(){
REGISTERED info = {0, "Apple", 0, 0, "passport", 0};
REGISTERED list;
AddUpdate(info);
SellPetrol();
}
void AddUpdate(REGISTERED info){
int choice;
FILE *registryfile = NULL;
registryfile = fopen("Sales.dat", "ab");
if (registryfile == NULL){
perror("Error: ");
}
else{
do{
printf("Company Code: ");
scanf("%d", &info.compcode);
printf("Company Name: ");
scanf("%s", &info.compname);
printf("Pin: ");
scanf("%d", &info.pinID);
printf("Customer ID: ");
scanf("%d", &info.custID);
printf("ID type: ");
scanf("%s", &info.IDtype);
printf("Company ID: ");
scanf("%d", &info.compID);
fseek(registryfile, (info.compcode - 1) * sizeof(REGISTERED), SEEK_SET);
fwrite(&info, sizeof(REGISTERED), 1, registryfile);
printf("Enter choice: ");
scanf("%d", &choice);
}while(choice == 1);
}
printf("\tCompany Code: %d\t\n", info.compcode);
printf("\tCustomer ID: %d\t\n", info.custID);
fclose(registryfile);
}
void SellPetrol(){
int code = 0, PIN;
REGISTERED list;
FILE *registryfile = NULL;
registryfile = fopen("Sales.dat", "rb");
if (registryfile == NULL){
perror("Error: ");
}
else{
printf("Please enter the company code: ");
scanf("%d", &code);
// printf("Please enter the PIN: ");
// scanf("%d", &PIN);
rewind(registryfile);
fseek(registryfile, (code - 1) * sizeof(REGISTERED), SEEK_SET);
fread(&list, sizeof(REGISTERED), 1, registryfile); //reads data into list
fflush(stdin);
printf("Company Code: %d\n", list.compcode);
printf("Company Name: %s\n", list.compname);
printf("Pin: %d\n", list.pinID);
printf("Customer ID: %d\n", list.custID);
printf("ID Type: %s\n", list.IDtype);
printf("Company ID: %d\n", list.compID);
}
fclose(registryfile);
}
最佳答案
看来无论你使用哪种方法来学习 C 都会带来麻烦,因为你所犯的错误似乎很常见。我建议读一本书,比如《K&R2E》……当你偶然发现它们时做练习;在完成它们之前不要继续,如有必要,请提出有关它们的问题。
<小时/><强> Don't fflush(stdin)
。 fflush
并没有按照你的想法去做。
检查 fopen
等函数的返回值 , scanf
, fseek
, fread
,甚至 fwrite
。您可能会发现您的fread
或scanf
返回一个指示失败的值,因此您所说的胡言乱语。
Be aware that C uses pass-by-value semantics ONLY 。代码中至少一个错误的根源是对这些语义的误解。即AddUpdate
无法修改 main
中声明的变量,因为它收到该变量的副本;此时看来void AddUpdate(REGISTERED info)
应该是void AddUpdate(void)
和info
应在AddUpdate
内声明.
<强> scanf("%s", &info.compname);
可能不会按照您的想法进行操作。 %s
指令告诉scanf
读取(元语言学上的)用户输入的单词(即,空格分隔的标记),而不是行(换行符分隔的标记)。您可能想要int x = scanf("%19[^\n]", info.compname);
或者更好的是,char *x = fgets(info.compname, sizeof info.compname, stdin);
...
<强> void main()
不可移植,#include <conio.h>
也是如此。 。您可能想要int main(void)
并且...您似乎没有使用 <conio.h>
中的任何功能,所以你可能不想要任何东西来代替它。在 C99 中,main
没有 return
的函数语句将隐式 return 0;
没有发出警告。
关于c - 如何将二进制文件中的特定行读入结构C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43567621/