【发布时间】:2020-12-14 09:47:43
【问题描述】:
我编写了一个基本代码,它以二进制模式(使用 fwrite())将字符串写入文件。我也可以从文件中读取相同的字符串(使用 fread())到缓冲区并打印它。它可以工作,但在我从文件中读取的部分,额外的垃圾也会被读入缓冲区。我的问题是如何正确知道要读取的字节的长度?
以下是代码--
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#define BUFSZ 81
char * get_string (char *, size_t);
int main (int argc, char * argv[])
{
if (argc != 2)
{
fprintf (stderr, "Invalid Arguments!!\n");
printf ("syntax: %s <filename>\n", argv[0]);
exit (1);
}
FILE * fp;
if ((fp = fopen(argv[1], "ab+")) == NULL)
{
fprintf (stderr, "Cannot openm file <%s>\n", argv[1]);
perror ("");
exit (2);
}
char string[BUFSZ];
char readString[BUFSZ];
size_t BYTES, BYTES_READ;
puts ("Enter a string: ");
get_string (string, BUFSZ);
// printf ("You have entered: %s\n", string);
BYTES = fwrite (string, sizeof (char), strlen (string), fp);
printf ("\nYou have written %zu bytes to file <%s>.\n", BYTES, argv[1]);
printf ("\nContents of the file <%s>:\n", argv[1]);
rewind (fp);
BYTES_READ = fread (readString, sizeof (char), BUFSZ, fp);
printf ("%s\n", readString);
printf ("\nYou have read %zu bytes from file <%s>.\n", BYTES_READ, argv[1]);
getchar ();
fclose (fp);
return 0;
}
char * get_string (char * str, size_t n)
{
char * ret_val = fgets (str, n, stdin);
char * find;
if (ret_val)
{
find = strchr (str, '\n');
if (find)
* find = '\0';
else
while (getchar () != '\n')
continue;
}
return ret_val;
}
【问题讨论】:
-
您能帮我们提供似乎导致此问题的输入字符串吗?您的程序的相应输出也会有所帮助。
-
您不能调用
fprintf后跟perror并期望得到合理的结果。fprintf可能会更改errno,因此perror打印的消息不再相关。只需:if( ((fp = fopen(argv[1]... ==NULL) { perror(argv[1]); ...}