C编程——如何将文本文件内容放入数组?
我正试图写一个程序,可以删除文件io中的记录。默认情况下会设置文件内容。现在我正在尝试将文本文件内容放入数组,但出现了一些问题 首先,它是我默认的数据文件内容:C编程——如何将文本文件内容放入数组?,c,arrays,struct,file-io,C,Arrays,Struct,File Io,我正试图写一个程序,可以删除文件io中的记录。默认情况下会设置文件内容。现在我正在尝试将文本文件内容放入数组,但出现了一些问题 首先,它是我默认的数据文件内容: 1001 eric 1 human 10 70.00 eric home arrive 1002 She 1 human 10 50.00 she home arrive 1003 She_eric 2 human 10 120.00 eric home arrive 这里是我的代码:(我用FSCAN
1001
eric
1
human
10
70.00
eric
home
arrive
1002
She
1
human
10
50.00
she
home
arrive
1003
She_eric
2
human
10
120.00
eric
home
arrive
这里是我的代码:(我用FSCANF把我的文本文件数据放到数组中,你可以在中间看到关于打开文件的读取)
#包括
#包括
结构记录{
charrecordnum[40];
字符项记录[40];
炭量[40];
煤焦重量[40];
char itemname[40];
煤焦分类[40];
字符接收者[40];
char最终目的地[40];
字符状态[40];
};
int main()
{
文件*fileptr1、*fileptr2、fileptr3;
char filename[40]=“record.txt”;
保存字符;
int delete_num,temp;
字符回复;
#定义最大值9
结构记录Arr[MAX];
printf(“输入文件名:”);
scanf(“%s”,文件名);
做{
temp=1;//重置temp和循环可以在低于时间的情况下工作
//以读取模式打开文件
fileptr1=fopen(文件名为“r”);
if(fileptr1==NULL){
printf(“打开不成功,文件不存在”);
出口(1);
}
save=getc(fileptr1);
while(保存!=EOF)
{
printf(“%c”,保存);
save=getc(fileptr1);
int i=0;
对于(i=0;i您正在使用getc
从文件中读取字符,但随后将其丢弃。因此,您可能会丢失有意义的字符。您也没有检查fscanf的返回值以查看它是否成功,留下在未意识到的情况下出错的可能性。您可以通过去掉getc
来修复这两个问题调用并使用fscanf
的返回值控制循环:
while (fscanf(fileptr1,"%39s%39s%39s%39s%39s%39s%39s%39s%39s",
Arr[i].recordnum, Arr[i].itemname, Arr[i].itemrecord,
Arr[i].catagory, Arr[i].quantity, Arr[i].weight,
Arr[i].recipient, Arr[i].final_destination, Arr[i].status) == 9) {
if (++i >= MAX)
break;
}
然后,要写入文件,您需要删除所请求的记录,而不仅仅是一行。因此,您最好的选择是使用之前读入Arr
的数据从头开始(重新)写入文件,并省略要删除的记录。fflush(stdin);
是UB,不要这样做。@SouravGhosh我现在不使用它,除了最后一个,还有什么建议吗?:)file not exist
如果文件存在,但由于其他原因无法打开,则可能是一条非常令人困惑的错误消息。不要试图猜测原因;让系统告诉您fopen
失败的原因。if((fileptrt1=fopen(filename,“r”)==NULL){perror(filename);exit(exit_FAILURE);}
我的意思是使用我之前读取到数组中的数据,并省略我要删除的记录。@Chris Doddfor(I=0;i@HangWui:准确地说,由于您的recordnum
是字符串而不是整数,您需要使用strcmp
而不是!=
您的意思是if(strcmp(Arr[i].recordnum,delete_num)==0)
?
Enter file name:record.txt
10
Enter record number to be deleted <type 0 = not delete anything>:1001
The contents of file after being changed are as follows:
0000000111
eeerrriiiccc
111
hhhuuummmaaannn
111000
777000...000
eeerrriiiccc
hhhooommmeee
aaarrrrrriiivvveee
while (fscanf(fileptr1,"%39s%39s%39s%39s%39s%39s%39s%39s%39s",
Arr[i].recordnum, Arr[i].itemname, Arr[i].itemrecord,
Arr[i].catagory, Arr[i].quantity, Arr[i].weight,
Arr[i].recipient, Arr[i].final_destination, Arr[i].status) == 9) {
if (++i >= MAX)
break;
}