#c
#c
Вопрос:
Это мой код
FILE *fp;
char line[255];
fp = fopen("./games/Dead Space.txt", "r");
// Check if fopen succeeds and those things goes here.
fgets(line, 255, fp);
char name[255];
strcpy(name, strtok(line, "n"));
printf("%s: a gamen", name);
Объяснение кода: я пытаюсь получить первую строку ./games/Dead Space.txt
и удалить, n
если таковые имеются.
Это ./games/Dead Space.txt
Dead Space
Shooter, 3D
Electronic Arts
И это вывод
: a gamece
Ожидаемый результат
Dead Space: a game
Кто-нибудь может мне помочь? Почему это происходит?
Комментарии:
1. Не связано: удалить конечную
'n'
строку сdata
помощьюdata[strcspn(data, "n")] = 0;
2. Вероятно, вы скопировали файл данных из Windows или с веб-сайта, на котором он был размещен из WIndows, или, возможно, создали с помощью редактора Unixy, который поддерживает режим ‘DOS’ или ‘CRLF’, например vim, и в результате он содержит CR LF окончания строк . Вы удаляете LF, но оставляете CR, поэтому затем вы выводите, например
Dead Space<CR>: a game
, который отображается на вашем терминале как: a gamece
. Проверьте сfile
помощью утилиты,cat -v
,sed -n l
(ell) или аналогичной.3. @dave_thompson_085 да, я на Windows… Как я могу это исправить?
4. Какую реализацию (компилятор, библиотеку и т.д.) Вы используете? Реализация, разработанная для Windows, такая как MSVC , уже должна переводить CRLF в NL в стиле C, хотя некоторые этого не делают по умолчанию: вам может потребоваться указать
t
(для текста, т.Е. недвоичного) в строкеfopen
mode . Если вы используете что-то, перенесенное на Windows, например cygwin или WSL, это менее согласованно, хотя проверьте документацию; возможно , вам потребуется удалить или поддержать CR самостоятельно.5. Это бесплатно: проверьте, успешно ли работает fopen.