Почему fgets () не читает весь файл? - PullRequest
1 голос
/ 25 февраля 2020

Я читаю из файла, чтобы сохранить текст в массив. Массив, в который в конечном итоге будет сохранен текст, представляет собой 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 (), чтобы прочитать содержимое файла и передать его в обычный текст [].

//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] = '\0';

//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] = '\0'; //remove \n at end of string at a result of fgets()
}

//close file
fclose(plainFile);

l oop сообщает fgets (), чтобы продолжить чтение, пока есть контент, но fgets () прекращает ввод контента в середине файла. Почему это?

Ответы [ 2 ]

2 голосов
/ 25 февраля 2020

В l oop:

while (fgets(temp2, STRING_LENGTH, plainFile)) {
    fgets(temp2, STRING_LENGTH, plainFile);
    strcat(plainText, temp2);
    bptr[strlen(bptr) - 1] = '\0'; //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] = '\0'; //remove \n at end of string at a result of fgets()
}
2 голосов
/ 25 февраля 2020

fgets читает одну строку в буфер каждый раз, когда он вызывается в условии

while (fgets(temp2, STRING_LENGTH, plainFile)) {

И затем вы снова вызываете его, заставляя прочитать вторую строку:

fgets(temp2, STRING_LENGTH, plainFile);

Если вы удалите эту вторую строку, ваш код должен работать так, как задумано. Ваш код в настоящее время не работает должным образом, потому что он копирует каждую вторую строку, используя strcat.

...