UNIX中的C:根据字节数读取/组合文件



我正在尝试修复下面的代码,使其只读取前几个N字节。我也想做同样的事情,但对于最后一个N字节数(我认为这只需要在字节数N前面加一个"-")。我不确定使用fget是否是正确的方法。

我试着在中更改1000

while(fgets(buffer, 1000, fp)

然而,我不认为更改该值会占用一定数量的字节,因为我已经读到它只是一个最大值。

char buffer[1001];
int main(int argc, char** argv) {
bzero(buffer, sizeof(buffer));
for(int x=1; x<argc; x++) {
FILE *fp = fopen(argv[x], "r+");
if (fp) {
while(fgets(buffer, 1000, fp)) {
printf("%s", buffer);
}
} else {
printf("could not open file %sn", argv[x]);
}
}
} 

假设您想要文件的前1000个字节和最后1000个字节,并且在很大程度上忽略了小于2000个字节的文件的问题(它有效,但您可能想要不同的结果),您可以使用:

#include <stdio.h>
enum { NUM_BYTES = 1000 };
int main(int argc, char **argv)
{
for (int x = 1; x < argc; x++)
{
FILE *fp = fopen(argv[x], "r");
if (fp)
{
char buffer[NUM_BYTES];
int nbytes = fread(buffer, 1, NUM_BYTES, fp);
fwrite(buffer, 1, nbytes, stdout);
if (fseek(fp, -NUM_BYTES, SEEK_END) == 0)
{
nbytes = fread(buffer, 1, NUM_BYTES, fp);
fwrite(buffer, 1, nbytes, stdout);
}
fclose(fp);
}
else
{
fprintf(stderr, "%s: could not open file %sn", argv[0], argv[x]);
}
}
}

这使用了注释中建议的fread()fwrite()fseek()

它还注意关闭成功打开的文件。它不要求对文件具有写权限,因为它只读取和不写入这些文件(在对fopen()的调用中使用"r"而不是"r+")。

如果文件小于1000字节,fseek()将失败,因为它试图寻找负偏移。如果发生这种情况,就不用再读或写1000个字节了。

我讨论了在函数调用中使用sizeof(buffer)还是NUM_BYTES。我认为NUM_BYTES更好,但这个选择并不是决定性的——使用sizeof(buffer)是有说服力的。

注意,buffer变为局部变量。没有必要将其归零;只有由fread()写入的条目将由fwrite()写入,因此不存在由bzero()解决的问题。(当变量是全局变量时,这一点毫无意义;具有静态持续时间的变量默认初始化为所有字节零。)

错误消息写入标准错误。

该代码不检查是否读取了零字节;可以说,它应该这样做。

如果NUM_BYTES成为一个参数(例如,您调用程序fl19并使用fl19 -n 200 file1打印file1的第一个和最后200个字节),那么您需要进行一些整理以及命令行参数处理。

最新更新