为什么 fgets() 不读取整个文件?
Why is fgets() not reading the entire file?
我正在读取文件以将文本保存到数组中。文本最终要保存到的数组是 plainText[ ]。但奇怪的是,fgets() 并没有读取整个文件。它在停止之前只读取了一半的文件。
这是文件的全部内容:
bbbbbbbbb
bbbbbbbbb
bbbbbbbbb
bbbbbbbbb
bbbbbbbbb
bbbbbbbbb
bbbbbbbbb
bbbbbbbbb
有 8 行 b,每列 9 个,总共 72 个 b。不过,我得到的输出在打印时只包含 36 个 b。
打印 plainText[ ] 时的输出:
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
这是打开和读取文件的代码。
int main(int argc, char **argv) {
//send an error code if the correct number of arguments have not been met to run the program
if (argc < 3) {
printf("Please enter the encryption file and the file to be encrypted.\n");
return ERROR;
}
//open file to be encrypted (aka, plaintext)
char *fileToEncrypt = argv[2];
FILE *plainFile = fopen(fileToEncrypt, "r");
//return an error code if the file to encrypt cannot be found
if (plainFile == 0) {
printf("The file you wish to encrypt cannot be found on this machine.\n");
printf("Please ensure that you are in the correct directory and that there are no typos.\n");
return ERROR;
}
这是我使用 fgets() 读取文件内容并将其传输到 plainText[ ] 的地方。
//read contents of file to encrypt
char plainText[STRING_LENGTH + 1], temp2[STRING_LENGTH + 1];
//fill array with null terminators so we don't receive
//memory errors from strcat(plainText, temp2)
for (int i = 0; i < STRING_LENGTH; i++)
plainText[i] = '[=13=]';
//pointer to end of string in order to remove \n
char *bptr = plainText;
//read the file again if it is found there are multiple lines
while (fgets(temp2, STRING_LENGTH, plainFile)) {
fgets(temp2, STRING_LENGTH, plainFile);
strcat(plainText, temp2);
bptr[strlen(bptr) - 1] = '[=13=]'; //remove \n at end of string at a result of fgets()
}
//close file
fclose(plainFile);
循环告诉 fgets() 只要有内容就继续读取,但 fgets() 在文件中途停止输入内容。这是为什么?
fgets
每次在条件
中调用时,将一行读入缓冲区
while (fgets(temp2, STRING_LENGTH, plainFile)) {
然后你再直接调用它,让它读取第二行:
fgets(temp2, STRING_LENGTH, plainFile);
如果您删除第二行,您的代码应该可以正常工作。
您的代码目前无法按预期工作,因为它仅使用 strcat
.
每隔一行复制一次
在循环中:
while (fgets(temp2, STRING_LENGTH, plainFile)) {
fgets(temp2, STRING_LENGTH, plainFile);
strcat(plainText, temp2);
bptr[strlen(bptr) - 1] = '[=10=]'; //remove \n at end of string at a result of fgets()
}
当您调用 fgets()
两次时,每隔一行将被丢弃。你看不到这一点,因为你所有的行都是平等的,如果你用文件中的不同行测试它,这将变得很明显。
要更正此问题,您可以尝试:
while (fgets(temp2, STRING_LENGTH, plainFile)) {
strcat(plainText, temp2);
bptr[strlen(bptr) - 1] = '[=11=]'; //remove \n at end of string at a result of fgets()
}
我正在读取文件以将文本保存到数组中。文本最终要保存到的数组是 plainText[ ]。但奇怪的是,fgets() 并没有读取整个文件。它在停止之前只读取了一半的文件。
这是文件的全部内容:
bbbbbbbbb
bbbbbbbbb
bbbbbbbbb
bbbbbbbbb
bbbbbbbbb
bbbbbbbbb
bbbbbbbbb
bbbbbbbbb
有 8 行 b,每列 9 个,总共 72 个 b。不过,我得到的输出在打印时只包含 36 个 b。
打印 plainText[ ] 时的输出:
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
这是打开和读取文件的代码。
int main(int argc, char **argv) {
//send an error code if the correct number of arguments have not been met to run the program
if (argc < 3) {
printf("Please enter the encryption file and the file to be encrypted.\n");
return ERROR;
}
//open file to be encrypted (aka, plaintext)
char *fileToEncrypt = argv[2];
FILE *plainFile = fopen(fileToEncrypt, "r");
//return an error code if the file to encrypt cannot be found
if (plainFile == 0) {
printf("The file you wish to encrypt cannot be found on this machine.\n");
printf("Please ensure that you are in the correct directory and that there are no typos.\n");
return ERROR;
}
这是我使用 fgets() 读取文件内容并将其传输到 plainText[ ] 的地方。
//read contents of file to encrypt
char plainText[STRING_LENGTH + 1], temp2[STRING_LENGTH + 1];
//fill array with null terminators so we don't receive
//memory errors from strcat(plainText, temp2)
for (int i = 0; i < STRING_LENGTH; i++)
plainText[i] = '[=13=]';
//pointer to end of string in order to remove \n
char *bptr = plainText;
//read the file again if it is found there are multiple lines
while (fgets(temp2, STRING_LENGTH, plainFile)) {
fgets(temp2, STRING_LENGTH, plainFile);
strcat(plainText, temp2);
bptr[strlen(bptr) - 1] = '[=13=]'; //remove \n at end of string at a result of fgets()
}
//close file
fclose(plainFile);
循环告诉 fgets() 只要有内容就继续读取,但 fgets() 在文件中途停止输入内容。这是为什么?
fgets
每次在条件
while (fgets(temp2, STRING_LENGTH, plainFile)) {
然后你再直接调用它,让它读取第二行:
fgets(temp2, STRING_LENGTH, plainFile);
如果您删除第二行,您的代码应该可以正常工作。
您的代码目前无法按预期工作,因为它仅使用 strcat
.
在循环中:
while (fgets(temp2, STRING_LENGTH, plainFile)) {
fgets(temp2, STRING_LENGTH, plainFile);
strcat(plainText, temp2);
bptr[strlen(bptr) - 1] = '[=10=]'; //remove \n at end of string at a result of fgets()
}
当您调用 fgets()
两次时,每隔一行将被丢弃。你看不到这一点,因为你所有的行都是平等的,如果你用文件中的不同行测试它,这将变得很明显。
要更正此问题,您可以尝试:
while (fgets(temp2, STRING_LENGTH, plainFile)) {
strcat(plainText, temp2);
bptr[strlen(bptr) - 1] = '[=11=]'; //remove \n at end of string at a result of fgets()
}