C 创建文本文件并以二进制模式重新打开文本文件
我编写了一个程序,创建一个文本文件,并以二进制模式重新打开该文本文件,下面是一个代码:C 创建文本文件并以二进制模式重新打开文本文件,c,file,C,File,我编写了一个程序,创建一个文本文件,并以二进制模式重新打开该文本文件,下面是一个代码: #include <stdio.h> #include <stdlib.h> void main() { char ch; FILE *fp; fp = fopen("/home/brushmonk/television_table_barchart.txt", "w+"); /* fp is an input stream */ if (fp == NULL)
#include <stdio.h>
#include <stdlib.h>
void main() {
char ch;
FILE *fp;
fp = fopen("/home/brushmonk/television_table_barchart.txt", "w+");
/* fp is an input stream */
if (fp == NULL) {
fprintf(stderr,
"Can't create television_table_barchart.txt.\n");
exit(EXIT_FAILURE);
}
char *p = "Television is one of the means whereby these feelings are
created and conveyed.\nThe table and bar chart show how journey time
in a city centre changed after improvements were made to the transport
network, and the costs of using different forms of transport in the
city.";
fputs(p, fp);
fp = fopen("/home/brushmonk/television_table_barchart.txt", "rb");
/* fp is an output stream */
while((ch = getc(fp)) != EOF)
putchar(ch);
putchar('\n');
if (fclose(fp) != 0)
fprintf(stderr,
"Error in closing television_table_barchart.txt.\n");
exit(EXIT_SUCCESS);
}
#包括
#包括
void main(){
char ch;
文件*fp;
fp=fopen(“/home/brushmank/television\u table\u barchart.txt”,“w+”);
/*fp是一个输入流*/
如果(fp==NULL){
fprintf(标准,
“无法创建TV_table_barchart.txt。\n”);
退出(退出失败);
}
char*p=“电视是表达这些情感的手段之一
创建并传送。\n表格和条形图显示行程时间
在交通改善后,市中心发生了变化
网络,以及在网络中使用不同运输方式的成本
城市。”;
fputs(p,fp);
fp=fopen(“/home/brushmank/television_table_barchart.txt”,“rb”);
/*fp是一个输出流*/
而((ch=getc(fp))!=EOF)
putchar(ch);
putchar('\n');
如果(fclose(fp)!=0)
fprintf(标准,
“关闭TV_table_barchart.txt时出错。\n”);
退出(退出成功);
}
但是我在linux上运行它。输出结果是什么都没有!发生了什么事?因为教科书上说在linux操作系统中,
fopen()
函数中的“rb”和“r”
没有区别。在以读取模式再次打开文件之前,您需要关闭文件以提交并保存对文件所做的更改
fclose(fp);
在以读取模式再次打开文件之前,需要关闭文件以提交并保存对文件所做的更改
fclose(fp);
在以读取模式重新打开文件之前,必须使用
fclose(fp)
关闭文件。更改在内存中缓冲,因此,如果在将挂起的数据刷新到磁盘之前以读取模式重新打开文件,则磁盘上的文件仍然为空
您应该避免使用嵌入的未转换换行符的字符串文字。您可以在多行上断开长文字,如下面的代码所示
还要注意,ch
必须具有类型int
,才能可靠地检测最后一个循环中的文件结尾
以下是修改后的版本:
#包括
int main(){
int-ch;
文件*fp=fopen(“/home/brushmank/television\u table\u barchart.txt”,“w+”);
/*fp是一个输入流*/
如果(fp==NULL){
fprintf(标准,
“无法创建TV_table_barchart.txt。\n”);
返回退出失败;
}
char*p=“电视是表达这些情感的手段之一”
“创建并传送。\n表格和条形图显示行程时间”
“在交通改善后,市中心发生了变化”
“网络,以及在网络中使用不同运输方式的成本”
“城市。”;
fputs(p,fp);
fclose(fp);
fp=fopen(“/home/brushmank/television_table_barchart.txt”,“rb”);
/*fp是一个输出流*/
而((ch=getc(fp))!=EOF)
putchar(ch);
putchar('\n');
如果(fclose(fp)!=0)
fprintf(stderr,“关闭电视时出错”\u table\u barchart.txt。\n”);
返回退出成功;
}
在以读取模式重新打开文件之前,必须使用fclose(fp)
关闭文件。更改在内存中缓冲,因此,如果在将挂起的数据刷新到磁盘之前以读取模式重新打开文件,则磁盘上的文件仍然为空
您应该避免使用嵌入的未转换换行符的字符串文字。您可以在多行上断开长文字,如下面的代码所示
还要注意,ch
必须具有类型int
,才能可靠地检测最后一个循环中的文件结尾
以下是修改后的版本:
#包括
int main(){
int-ch;
文件*fp=fopen(“/home/brushmank/television\u table\u barchart.txt”,“w+”);
/*fp是一个输入流*/
如果(fp==NULL){
fprintf(标准,
“无法创建TV_table_barchart.txt。\n”);
返回退出失败;
}
char*p=“电视是表达这些情感的手段之一”
“创建并传送。\n表格和条形图显示行程时间”
“在交通改善后,市中心发生了变化”
“网络,以及在网络中使用不同运输方式的成本”
“城市。”;
fputs(p,fp);
fclose(fp);
fp=fopen(“/home/brushmank/television_table_barchart.txt”,“rb”);
/*fp是一个输出流*/
而((ch=getc(fp))!=EOF)
putchar(ch);
putchar('\n');
如果(fclose(fp)!=0)
fprintf(stderr,“关闭电视时出错”\u table\u barchart.txt。\n”);
返回退出成功;
}
您忘了关闭文件
经验法则:对于任何其他资源,在获得文件句柄(通过fopen
)后,必须释放文件句柄(通过fclose
)。对于文件流,关闭流也会刷新它,也就是说,它在逻辑上将以前的写入操作提交到磁盘
只有在提交更改后才能保证从文件中读取
也就是说,您可以通过fflush
将更改提交到文件,而无需关闭它。因此,为了使代码正常工作,在初始的fputs
之后调用fflush(fp)
就足够了
但是,这并不能免除您释放文件句柄的责任(通过
fclose
)。您在代码末尾的fclose
调用是不够的,因为这会关闭一个不同的文件句柄:第二次调用fopen
时获得的句柄,您忘记关闭文件
经验法则:对于任何其他资源,在获得文件句柄(通过fopen
)后,必须释放文件句柄(通过fclose
)。对于文件流,关闭流也会刷新它,也就是说,它在逻辑上将以前的写入操作提交到磁盘
只有在提交更改后才能保证从文件中读取