C++ 将字符写入文件C++;
我有一个函数,在读取另一个文件时将随机数写入文件C++ 将字符写入文件C++;,c++,C++,我有一个函数,在读取另一个文件时将随机数写入文件 void writeFile() { FILE* file = fopen(source, "r"); FILE* file2 = fopen(target, "w"); srand (time(NULL)); while (!feof(file)) { fgetc(file); fputc(0 + ( rand() % ( 50 - 0 + 1 ) ), file2);
void writeFile() {
FILE* file = fopen(source, "r");
FILE* file2 = fopen(target, "w");
srand (time(NULL));
while (!feof(file)) {
fgetc(file);
fputc(0 + ( rand() % ( 50 - 0 + 1 ) ), file2);
}
fclose(file);
fclose(file2);
}
这两个文件的大小应该相同。结果是,与第一个文件相比,第二个文件的末尾有更多的1字节。如何避免这种情况?不要依赖于
feof
来告诉您已经阅读了所有字符。相反,请检查fgetc
中的返回值:
while (fgetc(file) != EOF) {
fputc(0 + ( rand() % ( 50 - 0 + 1 ) ), file2);
}
不要依赖feof告诉你你已经读了所有的字符。相反,请检查
fgetc
中的返回值:
while (fgetc(file) != EOF) {
fputc(0 + ( rand() % ( 50 - 0 + 1 ) ), file2);
}
最后一个fgetc(文件)
读取EOF,然后代码将它的一个字节写入新文件,只有在while
中测试feof
不要使用feof,而是使用以下选项:
if (fgetc(file) == EOF) break;
最后一个fgetc(文件)
读取EOF,然后代码将它的一个字节写入新文件,只有在while
中测试feof
不要使用feof,而是使用以下选项:
if (fgetc(file) == EOF) break;
除了EOF注释外,您还应该以二进制模式打开这两个文件
FILE* file = fopen(source, "rb");
FILE* file2 = fopen(target, "wb");
在非二进制模式下,可以转换行结尾(取决于平台)。这可能会更改读取或写入文件的字符数。以及EOF注释,您还应该以二进制模式打开这两个文件
FILE* file = fopen(source, "rb");
FILE* file2 = fopen(target, "wb");
在非二进制模式下,可以转换行结尾(取决于平台)。这可能会改变读取或写入文件的字符数。检查EOF不会神奇地发生在while块的两行之间。如果feof通过预测下一次调用fgetc是否返回EOF来工作,那么代码就很好了。不幸的是,对于你和其他数百万这样编写代码的程序员来说,它不是那样工作的。。。。对于我们这些必须不断让人们知道的人来说!检查EOF不会神奇地发生在while块的两行之间。如果feof通过预测下一次对fgetc的调用是否返回EOF来工作,那么您的代码就很好了。不幸的是,对于你和其他数百万这样编写代码的程序员来说,它不是那样工作的。。。。对于我们这些必须不断让人们知道的人来说!很好的定位!=)也许可以添加一个简短的句子来解释为什么这很重要。很好的发现!=)也许可以加上一句简短的话来解释为什么这很重要。