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来工作,那么您的代码就很好了。不幸的是,对于你和其他数百万这样编写代码的程序员来说,它不是那样工作的。。。。对于我们这些必须不断让人们知道的人来说!很好的定位!=)也许可以添加一个简短的句子来解释为什么这很重要。很好的发现!=)也许可以加上一句简短的话来解释为什么这很重要。