0

出于某种原因,当我调用 fwrite() 时,它不会覆盖指针指向的文件。当我运行程序时,它显示文件的标签被用户指定的输入标签替换。在我使用单独的代码检查文件以查看当前标签后,标签根本没有被替换。我相信我使用 fwrite 的方式有问题,并认为它真的会覆盖文件。在这种情况下,标签是标题。这是代码:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include "title.h"

char title[30];
char title1[30];

int main(int argc, char *argv[]){

FILE *fPtrs;

    // print the current tag
fPtrs = fopen(argv[1],"r+b");
fseek(fPtrs,-125,SEEK_END);
fread(title1,1,30,fPtrs);
strncpy(title,title1,30);
printf("%s\n",title);
fclose(fPtrs);

    // call to overwrite the current tag
fPtrs = fopen(argv[1],"w+b");
title_tag(fPtrs,argv[2]);   
fclose(fPtrs);

    // print the tag of the should be overwritten file
fPtrs = fopen(argv[1],"r+b");
fseek(fPtrs,-125,SEEK_END);
fread(title1,1,30,fPtrs);
strncpy(title,title1,30);
printf("%s\n",title);
fclose(fPtrs);

return 0;
}

#include<stdio.h>
void title_tag(FILE* fName, char title_s[]){

fseek(fName,-125,SEEK_END);
fwrite(title_s,1,30,fName);

}

这是我在大学里做的一个项目,我们被告知不允许使用 id3lib -.-

4

2 回答 2

1
  1. 您没有进行任何输入验证。您的程序取决于有两个命令行参数,但您没有测试argc == 3或类似的东西。

  2. 没有错误检查。在盲目假设第一个命令行参数是正确指定的文件名之后,您不会检查调用的返回值fopen()来验证调用是否成功。您也没有进行任何检查来验证您打开的文件最后是否有 ID3v1 标签,您只是假设它存在。

  3. 当你调用 时fread(),你并不确定你读到的是一个有效的字符串,但是你会继续把它当作一个字符串来对待。(您正在读取一个 30 字节的字段,但在我看来,它不需要是一个以空字符结尾的30 字节字段。如果曲目标题是 30 字节长会怎样?

  4. 为什么要将标题从titleinto复制title1?完全撇开你没有确保它是空终止的,因此应该是空终止它或使用memcpy(),你对副本所做的唯一事情就是将它传递给printf(). 复制它给你带来了什么?

  5. 您不应该关闭/重新打开/关闭/重新打开文件。第一次打开它时,您使用的是 mode "r+b",它打开文件进行读写所以您需要做的就是fseek(). (当然,还有完整性检查,看看您是否可以更新现有的 ID3v1 标记,或者是否需要附加一个。)

  6. 真的不应该关闭/重新打开/关闭/重新打开文件。"w+b"当您不必要地关闭/重新打开文件以对其进行更新时,您正在使用的打开模式 被记录为如果文件已经存在则将文件截断为零长度,否则创建一个新文件。

  7. 你传递给你的title_tag()函数的东西。

    • 由于您正在使用它,第二个参数title_tag()需要是至少 30 字节的存储块。您正在通过它argv[2],但不能保证是这样。您需要复制argv[2]到自己的存储中,然后将其传递。

    • 您已经编写了title_tag()函数,因此有人可能会错误地认为函数中的第二个参数是一个数组。然而,由于 C 语言的机制,在函数的上下文中,参数只是一个指向字符的指针。(您可以将其写为char title_s[],但在 C 中,如果您将数组作为参数传递给函数,则该函数实际获得的是指向数组第一个元素的指针。对于大多数用途,这没有任何功能区别。)

那里。希望有帮助。

于 2013-10-14T19:17:59.787 回答
0

强烈推荐使用 id3lib。将允许您更好地控制 id3 标签的操作,而不仅仅是尝试写入文件 raw

http://id3lib.sourceforge.net/

于 2013-10-10T17:32:17.687 回答