Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C编程——如何将文本文件内容放入数组?_C_Arrays_Struct_File Io - Fatal编程技术网

C编程——如何将文本文件内容放入数组?

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

我正试图写一个程序,可以删除文件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

这里是我的代码:(我用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 Dodd
for(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;
}