您好,我正在尝试打印文件的剩余内容后,我做了一个fseek。现在我没有得到任何回报。我的代码出了什么问题?
#include <stdio.h>
int main(int argc, char *argv[]){
FILE *fr;
if (fr = fopen (argv[1], "r")){
fseek(fr, 100, SEEK_CUR);
char c[1];
while (fread(c, 1, sizeof(c),fr) > 0)
printf("%s", c);
fclose(fr);
}
else{
perror("File does not exist");
}
}
答案 0 :(得分:2)
正如其他答案所指出的那样,你传递的printf字符串可能不是NULL终止的。您也没有验证正在读取的文件是否大于100个字节。最后一点,您在fread()
中交换了size_t size
和size_t niters
参数。
以下是您的程序的修改版本,它修复了上述问题(并稍微清理了间距):
#include <stdio.h>
#include <sys/stat.h>
int main(int argc, char *argv[])
{
FILE *fr;
char c[1];
struct stat sb;
// obtains information about the file
if (stat(argv[1], &sb) == -1)
{
perror("stat()");
return(1);
};
// verifies the file is over 100 bytes in size
if (sb.st_size < 101)
{
fprintf(stderr, "%s: file is less than 100 bytes\n", argv[1]);
return(1);
};
// opens the file, or prints the error and exists
if (!(fr = fopen (argv[1], "r")))
{
perror("fopen():");
return(1);
};
fseek(fr, 100, SEEK_CUR);
while (fread(c, sizeof(c), 1, fr) > 0)
printf("%c", c[0]);
fclose(fr);
return(0);
}
您还可以通过将char c[1];
更改为某行char c[1024];
并将while语句更新为:
while (fread(c, sizeof(char), 1023, fr) > 0)
{
c[1023] = '\0';
printf("%s", c);
};
答案 1 :(得分:1)
您无法使用%s
打印,因为您的字符串需要以空终止并且您只有一个字符。
使用方法:
printf("%c",*c);
并非所有字符都可打印,请检查ascii table以查看哪些字符可打印,哪些不可打印。例如,打印0将不会在屏幕上打印任何内容,AFAIK
答案 2 :(得分:0)
您正在读取一个字节但尝试使用%s
打印它,它需要一个以空字符结尾的字符串。将其更改为%c
(当然还有c
更改为*c
,以便与格式字符串一致!)应该可以解决问题。
特别是如果您读取的字节值等于0
,带printf
说明符的%s
将完全没有输出(因为它认为您反复要求它打印空字符串)。
答案 3 :(得分:0)
printf("%s",blabla)
应该打印以null结尾的字符串。打印一个字符使用printf("%c",c[0])
。