我正在尝试修复下面的代码,只读取前几个N字节。我也想做同样的事情,但对于N个字节的最后一个数字(我假设只涉及在字节数N前面添加' - ')。我不确定使用fget是否是正确的方法。
我尝试更改
中的1000while(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 %s\n", argv[x]);
}
}
}
答案 0 :(得分:0)
假设您想要文件的前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 %s\n", argv[0], argv[x]);
}
}
}
这会根据评论中的建议使用fread()
,fwrite()
和fseek()
。
关闭成功打开的文件也很小心。它不要求对文件的写入权限,因为它只读取并且不写入这些文件(在"r"
的调用中使用"r+"
而不是fopen()
。
如果文件小于1000字节,fseek()
将失败,因为它试图寻找负偏移。如果发生这种情况,请不要再读取或写入另外1000个字节。
我在函数调用中讨论了是否使用sizeof(buffer)
或NUM_BYTES
。我认为NUM_BYTES
更好,但选择不是确定的 - 有使用sizeof(buffer)
的有力论据。
请注意buffer
成为局部变量。没有必要把它归零;只有fread()
写入的条目才会由fwrite()
撰写,因此bzero()
无法解决问题。 (当变量是全局变量时,并没有任何重点;静态持续时间的变量默认初始化为所有字节为零。)
错误消息将写入标准错误。
代码不检查零字节读取;可以说,它应该。
如果NUM_BYTES
成为参数(例如,您调用程序fl19
并使用fl19 -n 200 file1
打印file1
的第一个和最后200个字节),那么您需要做一些整理以及命令行参数处理。