Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.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_File - Fatal编程技术网

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
)。对于文件流,关闭流也会刷新它,也就是说,它在逻辑上将以前的写入操作提交到磁盘

只有在提交更改后才能保证从文件中读取