2016-08-19 3 views
-2

Таким образом, у меня есть входной файл, который выглядит следующим образом:Удаление новой строки из текстового файла в C

line1 
line2 

и я хочу написать файл вывода, как это:

line1,line2 

И для теперь выход с новой строки, как это:

line1, 
line2, 

Если я заменить \ р с \ п на выходе будет как вход.

Вот мой код:

int main() 
{ 
/* Pointer to the file */ 
FILE *fp1; 
FILE *fp2; 
/* Character variable to read the content of file */ 
char c; 


/* Opening a file in r mode*/ 
fp1= fopen ("Newfile.txt", "r"); 
fp2 = fopen ("result.txt","w"); 
/* Infinite loop –I have used break to come out of the loop*/ 
while(1) 
{ 
    c = fgetc(fp1); 
    if(c==EOF) 
     break; 
     else if(c=='\r') 
       fprintf(fp2,","); 
     else 
      fprintf(fp2,"%c", c); 


} 

fclose(fp1); 
fclose(fp2); 
return 0; 
} 
+2

'c' должен иметь тип' int' (тот же тип, что и 'EOF', тот же тип, что и возвращаемый из' fgetc() ', тот же тип, что и' '\ r''). – pmg

+0

изменен и ничего не влияет на –

+1

Возврат строки в windows: '\ n \ r' и' \ n' в unix и, возможно, '\ r' в какой-то старой Mac-системе – dvhh

ответ

0

Вы можете использовать fgets, а затем заменить \n с , использованием strchr:

char str[512], *p; 
... 
while (fgets(str, sizeof str, fp1)) { 
    p = strchr(str, '\n'); 
    if (p != NULL) { 
     *p = ','; 
    } 
    fprintf(fp2,"%s", str); 
} 
+0

не много. все функции f * буферизуются внутри. когда вы вызываете fgetc в первый раз, он заполняет буфер фиксированного размера, и каждый последующий вызов fgetc после этого попытается прочитать из этого буфера. – DeftlyHacked

+0

Вы правы, я читал http://stackoverflow.com/questions/5186457/c-fgets-versus-fgetc-for-reading-line, и кажется, что разница минимальна, спасибо. –

2

Вы читаете файлы в "текстовом режиме". Это означает, что библиотека времени выполнения выполняет некоторый перевод, в частности, она преобразует CRLF («\ r \ n») в LF («\ n»). Ваш код никогда не увидит '\r'.

Вариант 1: заменить '\n' с запятой

Вариант 2: открывать файлы в двоичном режиме: fopen("foobar", "rb")

+0

Вариант 1: вывод такой же, как и для ввода и Option 2: То же самое, вывод только с символом «,» в конце строки. –

0

Значение EOF не используется для стандартных файлов. Он используется для передачи данных. Вам нужно будет на самом деле вызвать феод.

+0

Нет ничего плохого в проверке 'EOF' с файлами, конечно, тип должен быть' int', а не 'char' –

+0

. Для цитирования документации:« Если возникает ошибка чтения, функция возвращает EOF и устанавливает индикатор ошибки для потока (ferror). " Только EOF не означает EOF, это означает обобщенную ошибку. EOF имеет смысл только при передаче данных. – DeftlyHacked

+1

http://stackoverflow.com/a/4292738/1606345 и http://stackoverflow.com/a/4292802/1606345 –

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