2016-03-02 2 views
0

Так что я печатаю символ в файл, и всякий раз, когда заканчивается строка, он просто делает что-то странное.Печать символа в файл дает странный результат

Это код, я использую:

void opdracht43() { 
    FILE *file; 
    FILE *file2; 
    file = fopen("opdracht1.1.cpp", "r"); 
    file2 = fopen("Disc.c", "w"); 
    int p; 
    char a[100]; 
    while (fgets(a, 100, file)) { 
     for (int i = 0; i < sizeof a; i++) { 
      if (a[i] == '\n' || a[i] == ' ' || a[i] == '\t') { 
       printf("TRUE"); 
      } 
      else { 
       printf("FALSE"); 
       fputc(a[i], file2); 
      } 
     } 
     return 0; //So it only prints the 1st line for now. 
    } 
    fclose(file); 
    fclose(file2); 
} 

И когда это работает, это текст дает:

#include<stdio.h> ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ 

Пространство между> и я дает мне странный черный NUL в Notepad ++

Первая строка файла:

#include<stdio.h> 

Я надеюсь, что смогу найти помощь здесь :)

+2

Вы являетесь всегда пытается вывести 100 байт (пропускать пробелы). Но вы должны выйти из цикла for, когда на входе встречается '\ 0', поскольку это означает конец чтения' fgets'. В противном случае вы выводите прошлые действительные данные ввода и, следовательно, мусор. – kaylum

+1

, расширяющий комментарий @kaylum, 'i

+0

' for (int i = 0; i ' for (size_t i = 0; a [i]; i ++) {' – chux

ответ

0

Изменить

for (int i = 0; i < sizeof a; i++) { 

в

for (int i = 0; a[i] != '\0' && i < sizeof a; i++) { 

В вашем случае, в первом вызове fgets() дает массив a эти значения: '#', 'я', 'п', «C ', ...,' o ','. ',' h ','> 'и' \ 0 '. Однако остальная часть a по-прежнему содержит мусор, такой как Ì, потому что a никогда не инициализируется.

«\ 0» - это просто «странный черный нуль», о котором вы упомянули. A '\ 0' - это сигнал конца строки в стиле C, но он не стоит в конце файла, поэтому его не следует записывать в «Disc.c», используя fputc()

-1

sizeof a является размер в байтах переменной a, который всегда 100. Вы хотите ограничить свой цикл с длиной строки, состоявшейся в a, который есть strlen(a).

Кроме того, вы не должны писать в текстовые файлы символов по символам. Это не то, как файлы ввода/вывода предназначены для работы.

+0

Написание персонажа за раз не является проблемой, так как оно буферизуется (и выход фильтруется для удаления некоторых символов). Нет никакого преимущества хранить отфильтрованную последовательность в еще одном буфере (как вы подразумеваете, было бы лучше). –

+0

Потоки в C на самом деле предназначены для записи или чтения по одному символу за раз. 'fgetc' и' fputc' являются примитивами, и вы обнаружите, что другие функции потока реализованы путем вызова односимвольных примитивов (или вы использовали их в любом случае) –

Смежные вопросы