【问题标题】:Adding end-of-string characters to file corrupts it..?将字符串结尾字符添加到文件会损坏它..?
【发布时间】:2018-04-28 21:25:41
【问题描述】:

我正在创建一个 shell 并试图让评论处理工作。我可以传入一个文本文件作为参数。我有一个文本文件“输出”,如下所示:

123
#456
$#789

我想通过将# 替换为'\0' 来“结束”从'#' 开始的任何字符串。

int removeComments(char* fileName){ 
   FILE* myfile;
   int c;
   myfile = fopen(fileName, "r+");
   if(myfile == NULL){
      fprintf(stderr, "cannot open %s\n", fileName);
      exit(-1);
   }

   while((c = fgetc(myfile)) != EOF){

      if(c == '$'){
         c = fgetc(myfile);       // (don't change '$#')
      }
      else if(c == '#'){
         fseek(myfile, -1, SEEK_CUR);
         fputc('\0', myfile);                 //replace '#' with '\0'
         fseek(myfile, 0, SEEK_CUR);
      }
   }
   return 0;
}

如果我将'#' 替换为'!' 或任何其他字符,则可以正常工作,将文件更改为如下所示:

123
!456
$#789

但是,在我运行此代码并输入字符串结尾字符后,我无法再打开我的文件,我的计算机显示 "Could not display "output". The file is of an unknown type"。我怎样才能防止这种情况?或者如果需要,我该如何解决这个问题?

【问题讨论】:

    标签: c string file character


    【解决方案1】:

    许多编辑器不允许您打开其中包含“\0”的文件。 vim 例如可以显示文件。但是 gedit 不能。你可以试试https://superuser.com/questions/246014/use-gedit-to-open-file-with-null-characters给出的建议。

    【讨论】:

    • 有趣,我不知道。那么复制文件,然后将带有 cmets 的副本传递到我的 shell 是否明智?这样我仍然可以编辑原始输出文件。
    • 取决于您想要实现的目标,这可能不是一个坏主意。在脚本中传递它时,您可以清除 cmets(之后的任何内容并包含“#”)。但是,如果您想按原样编辑该文件,请保留“输出文件”中的原始内容。
    猜你喜欢
    • 2017-02-07
    • 1970-01-01
    • 1970-01-01
    • 2021-07-28
    • 1970-01-01
    • 2021-09-05
    • 1970-01-01
    • 1970-01-01
    • 2013-02-02
    相关资源
    最近更新 更多