如何更改函数,以便可以将整个标头解析为新文件?

时间:2018-12-06 19:00:00

标签: c ppm

因此,我创建了一个函数,该函数能够从文件中提取标题并将其放入没有注释的新文件中。所有.ppm文件的最大颜色值为255,所以这是我的功能:

void headerinfo(FILE *infile, FILE *outfile){

    char line[100];
    int c;

    fgets(line,100,infile);
    c=strlen(line);

    while(line[c]!='\n' && line[c-1]!='5' && line[c-2]!='5' && line[c-3]!='2'){
            if(line[0]=='#'){
                    fgets(line,100,infile);
                    c=strlen(line);
            }
            else{
                    fputs(line,outfile);
                    fgets(line,100,infile);
                    c=strlen(line);
                 }
        }
        fputs(line,outfile);
}

我遇到的问题是我有两个.ppm文件,它们的标题格式相似,但是一个561 x 375尺寸的文件不会将最后一行255输出到新文件中。这两个文件是否受我的代码影响?

Here is the .ppm file that does not copy over the 255 line

Here is the .ppm file that does copy the 255 line

.ppm file that works

.ppm file that does not work

1 个答案:

答案 0 :(得分:1)

c条件错误。由于line[c]是字符串的长度,因此'\n'指向结尾的空字符。它永远不能是line[c-1]'\n''5'的结尾行(文件的最后一行可能除外),因此它永远不会'5'(除非最后一行以line[c-2]结尾)。当然,line[c-3]while (! (4 <= c && line[c-4] == '2' && line[c-3] == '5' && line[c-2] == '5' && line[c-1] == '\n')) { 也不合适。

您真正想要的是:

void headerinfo(FILE *infile, FILE *outfile)
{
    char line[100];
    size_t c;

    do
    {
        fgets(line, sizeof line, infile);
        c = strlen(line);
        if (line[0] != '#')
            fputs(line, outfile);
    } while (! (4 <= c && strcmp(&line[c-4], "255\n") == 0));
}

有一些改进:

public class Menu extends AppCompatActivity {
dbhelper mydb;
//....
    @Override
    protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_menu);
      Intent intent = getIntent();
      String user = intent.getExtras().getString("nama");
      // ..rest of your code...
    }
}