перезапись printf, strcat добавляет только первую строку файла - PullRequest
0 голосов
/ 08 января 2019

Я выполняю простую задачу: чтение одной строки за раз из файла , печать строки и добавление всего содержимого в массив символов. Все началось с Segmentation fault (core dumped) из моего проекта, затем я продолжал изолировать свой код, пока не достиг этого:

#include <stdio.h>
#include <string.h>
int main(void)
{
    FILE *fp;
    fp = fopen("read.txt","r");
    char buffer[255];
    char longBuff[1024] = "";
    while(fgets(buffer, 255, fp)) {
        printf("%s\n",buffer);
        strcat(longBuff, buffer);
    }
    fclose(fp);
    printf("WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWTF%s\n", longBuff);
}

Файл read.txt:

short
this is Longer
+++++
sad

И вывод:

sad++is Longer
sad++is LongerWWWWWWWWWWWWWWWWWWWTFshort

Когда я с уверенностью ожидал:

short
this is Longer
+++++
sad
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWTFshortthis is Longer+++++sad

Я задавал несколько похожих вопросов, и большинство ответов относятся к возврату каретки , но я до сих пор не понимаю это поведение и его причину.

Ответы [ 2 ]

0 голосов
/ 08 января 2019

Текстовый файл, вероятно, создан на платформе с "\r\n" окончаниями строк @M.M.

Простое решение использует преимущество, если произойдет "\r", это подавляющая часть конца строки и может быть легко оторвано. strcspn()

Теперь я вижу, @ Дэвид С. Ранкин предложил это.

while(fgets(buffer, sizeof buffer, fp)) {
  // Find length of string not made up of '\n', '\r', '\0'
  // This nicely lops off the line ending, be it "\n", "\r\n" or missing.
  buffer[strcspn(buffer, "\n\r")] = '\0';
  printf("<%s>\n",buffer);
}

К сожалению, когда в конце строки текстового файла используется только "\r", fgets() (в системе, ожидающей "\n"), не увидит окончания строки. Там нужен новый подход.

0 голосов
/ 08 января 2019

Поскольку я использую Linux, проблема была с входным файлом. После запуска file read я получил read: ASCII text, with CR line terminators, и CR LT вызывали перезапись на этом этапе. Создан новый входной файл newFile: ASCII text с тем же текстом, и результат получился, как и ожидалось.

...