FILE *fp;//定义文件指针 if((fp=fopen("chen.c","rb"))==NULL)//打开文件,并判定是否出错 { printf("创建文件失败! !!\n");//打印出错提示 getchar(); exit(0);
时间: 2024-04-07 17:29:25 浏览: 96
这段代码是用来打开一个名为"chen.c"的文件,并且以二进制方式读取文件内容。如果文件打开失败,会输出一条错误提示并且终止程序的运行。在这段代码中,使用了fopen函数来打开文件,并将返回值赋值给一个文件指针变量fp。同时,利用了条件判断语句if来判断文件是否打开成功,如果打开失败就输出错误提示并终止程序的运行。最后,利用了exit函数来终止程序的运行。
相关问题
分析一下代码 void Load_Book() /* 加载图书信息 */ { BK *p1,*p2,*p3; FILE *fp; /*创建文件型指针 */ fp=fopen("Book.txt","rb"); /*打开文件 */ p1=(BK *)malloc(sizeof(BK)); fread(p1,sizeof(BK),1,fp); h_book=p3=p2=p1; while(! feof(fp)) /*读出信息 ,重新链入链表 */ { p1=(BK *)malloc(sizeof(BK)); fread(p1,sizeof(BK),1,fp); p2->next=p1; p3=p2; p2=p1; } p3->next=NULL; free(p1); fclose(fp); /*关闭文件 */ }
这段代码的作用是从文件中加载图书信息,并将其存储到链表中。程序首先创建三个节点指针p1、p2、p3,然后打开文件,读取文件中的第一个节点,将其存储到p1指向的节点中。程序将h_book、p3、p2、p1都指向该节点,表示该节点是链表的头节点。然后程序通过while循环,不断读取文件中的每个节点,并将其存储到链表中。具体而言,程序创建一个新的节点p1,读取文件中的一个节点信息,将其存储到p1指向的节点中,然后将p2的next指针指向p1,表示将该节点加入到链表中。程序将p3指向p2,p2指向p1,表示将p1节点变成下一个新的节点的前一个节点。循环直到读取到文件末尾,此时p2指向最后一个节点,程序将其next指针设置为NULL,表示链表结束。最后程序释放p1节点的内存,关闭文件。
#include<stdio.h> #include<unistd.h> main() { int p1,p2,i; int *fp; fp = fopen("to_be_locked.txt" ,"w+"); if (fp==NULL) { printf("Fail to create file"); exit(-1); } while((p1=fork( ))== -1); /*创建子进程p1*/ if (p1==0) { lockf(*fp,1,0); /*加锁*/ for(i=0;i<10;i++) fprintf(fp,"daughter %d\n",i); lockf(*fp,0,0); /*解锁*/ } else { while((p2=fork( ))==-1); /*创建子进程p2*/ if (p2==0) { lockf(*fp,1,0); /*加锁*/ for(i=0;i<10;i++) fprintf(fp,"son %d\n",i); lockf(*fp,0,0); /*解锁*/ } else { wait(NULL); lockf(*fp,1,0); /*加锁*/ for(i=0;i<10;i++) fprintf(fp,"parent %d\n",i); lockf(*fp,0,0); /*解锁*/ } } fclose(fp); } #include<stdio.h> #include<unistd.h> main() { int p1,p2,i; int *fp; fp = fopen("to_be_locked.txt" ,"w+"); if (fp==NULL) { printf("Fail to create file"); exit(-1); } while((p1=fork( ))== -1); /*创建子进程p1*/ if (p1==0) { lockf(*fp,1,0); /*加锁*/ for(i=0;i<10;i++) fprintf(fp,"daughter %d\n",i); lockf(*fp,0,0); /*解锁*/ } else { while((p2=fork( ))==-1); /*创建子进程p2*/ if (p2==0) { lockf(*fp,1,0); /*加锁*/ for(i=0;i<10;i++) fprintf(fp,"son %d\n",i); lockf(*fp,0,0); /*解锁*/ } else { wait(NULL); lockf(*fp,1,0); /*加锁*/ for(i=0;i<10;i++) fprintf(fp,"parent %d\n",i); lockf(*fp,0,0); /*解锁*/ } } fclose(fp); }
这段代码存在一些问题:
1. 在头文件中应该加入stdlib.h,以便使用exit()函数。
2. 指针fp没有初始化,应该改为FILE *fp。
3. lockf()函数需要传入文件描述符,而不是文件指针,可以使用fileno()函数转换。
4. 在子进程执行lockf()函数之前应该先关闭子进程不需要的文件描述符,否则文件锁可能不会如期生效。
5. 父进程应该等待两个子进程完成后再执行。
下面是改正后的代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
int main() {
int p1, p2, i;
FILE *fp;
fp = fopen("to_be_locked.txt", "w+");
if (fp == NULL) {
printf("Fail to create file");
exit(-1);
}
while ((p1 = fork()) == -1);
if (p1 == 0) { // 子进程p1
fclose(fp); // 关闭不需要的文件描述符
fp = fopen("to_be_locked.txt", "a"); // 重新打开文件
lockf(fileno(fp), 1, 0); // 加锁
for (i = 0; i < 10; i++)
fprintf(fp, "daughter %d\n", i);
lockf(fileno(fp), 0, 0); // 解锁
fclose(fp);
} else {
while ((p2 = fork()) == -1);
if (p2 == 0) { // 子进程p2
fclose(fp);
fp = fopen("to_be_locked.txt", "a");
lockf(fileno(fp), 1, 0);
for (i = 0; i < 10; i++)
fprintf(fp, "son %d\n", i);
lockf(fileno(fp), 0, 0);
fclose(fp);
} else { // 父进程
wait(NULL); // 等待子进程p1完成
wait(NULL); // 等待子进程p2完成
lockf(fileno(fp), 1, 0);
for (i = 0; i < 10; i++)
fprintf(fp, "parent %d\n", i);
lockf(fileno(fp), 0, 0);
fclose(fp);
}
}
return 0;
}
```
阅读全文