我写了一个程序
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
FILE *fp;
int r;
char arr[] = "this is the string";
char str[20] = {'\0'};
fp = fopen("fwrite.txt", "w");
fwrite(arr, 1, sizeof(arr), fp);
fseek(fp, SEEK_SET, 0);
r = fread(str, 1, sizeof(arr), fp);
if(r == sizeof(arr))
printf("read successfully\n");
else
{
printf("read unsuccessfull\n");
exit(1);
}
printf("read = %d\n", r);
printf("%s\n", str);
fclose(fp);
return 0;
}我正试着用这种方式阅读,但我做不到。这里的问题是,我应该放置&str[i]并为fread运行一个循环,还是fread能够将数据放入str?
我得到的垃圾,我不明白为什么?
发布于 2017-04-11 14:44:27
主要的问题是,您有向后fseek()的参数--在whence (SEEK_SET)之前需要偏移量(0)。第二个问题是,您试图从只为写入打开的文件中读取。在这种情况下,一个更小的问题,但一个通常非常重要的问题是,您不会错误地检查fopen()调用。(相对来说,这个fopen()失败的可能性不大,但人们已经知道了更有趣的事情。)您还应该检查fwrite()调用(当然,您已经检查了fread() )。
解决所有这些问题可能会导致:
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int rc = EXIT_SUCCESS;
int r;
const char file[] = "fwrite.txt";
char arr[] = "this is the string";
char str[20] = {'\0'};
FILE *fp = fopen(file, "w+b");
if (fp == 0)
{
fprintf(stderr, "Failed to open file %s for reading and writing\n", file);
rc = EXIT_FAILURE;
}
else
{
if (fwrite(arr, 1, sizeof(arr), fp) != sizeof(arr))
{
fprintf(stderr, "Failed to write to file %s\n", file);
rc = EXIT_FAILURE;
}
else
{
fseek(fp, 0, SEEK_SET);
r = fread(str, 1, sizeof(arr), fp);
if (r == sizeof(arr))
{
printf("read successful\n");
printf("read = %d bytes\n", r);
printf("read data [%s]\n", str);
}
else
{
printf("read unsuccessful\n");
rc = EXIT_FAILURE;
}
}
fclose(fp);
}
return rc;
}示例运行:
$ ./fi37
read successful
read = 19 bytes
read data [this is the string]
$请注意,这在一定程度上是因为您将输出字符串末尾的空字节写入文件,然后将其读取回文件。如果该文件包含空字节,则该文件实际上不是文本文件。在二进制文件和文本文件之间没有区别的Unix系统上并不真正需要处于"w+b"模式的"w+b"。如果要向Windows上的文件写入空字节,则应使用b指示二进制模式。
如果您选择这样做,您可以通过在return函数中没有一个main()来减少‘繁忙’(或嵌套的深度)。您可以使用return EXIT_FAILURE;并避免使用else和另一组大括号。如果文件已打开,所显示的代码将小心关闭。在通用函数中,这很重要。在main()中,它并不那么重要,因为退出的过程无论如何都会刷新和关闭打开的文件。
发布于 2017-04-11 14:45:31
不能在文件中使用"w"模式读取fopen,而是使用"w+"。
"r" -打开一个文件进行读取。文件必须存在。
"w" -创建一个用于写入的空文件。如果同名文件已经存在,则其内容被擦除,并且该文件被视为一个新的空文件。
"a" -附加到文件中。写入操作,在文件末尾追加数据。如果文件不存在,则创建该文件。
"r+" -打开一个文件来更新读写。文件必须存在。
"w+" --为读写创建一个空文件。
"a+" -打开一个用于读取和附加的文件。
https://stackoverflow.com/questions/43348672
复制相似问题