2016-12-28 5 views
-2

Я использую getchar() и loop, чтобы получить текст, и использовать fputc() для вставки в текстовый файл, но он всегда оставляет первую строку пустой в текстовом файле после записи. Цикл прекращается, когда ввод символов является точкой (.). Как удалить первую строку?fputc оставляет первую строку пустой перед вставкой текста

Обновлено (12/29/2016): Я использовал DevC++, и коды выполнялись без создания пустого пустого места, но в моем VisualStudio2015 возникла проблема.

Пример: создать файл с именем test.txt

вход: это текст.

выход: (в текстовом файле)

[пустая строка]

это текст

void writeFile(char *fileName){ 
    FILE *fp; 
    fp = fopen(fileName, "wt"); //write text 
    if (fp == NULL) { 
     cout << "Failed to open" << endl; 
     fclose(fp); 
    } 
    else { 
     int i = 0; 
     char c = '\0';   
     cout << "Enter a text and end with dot (.): "; 
     fflush(stdin); 
     //c = getchar(); 
     while (c != '.') { 
      fputc(c, fp); 
      c = getchar(); 
     } 
     cout << "Written successfully" << endl; 
     fclose(fp); 
    } 
} 
+2

Попробуйте реверсивный порядок fputc() и GetChar() линий. –

+1

'fflush (stdin)' не очищает входной поток, он предназначен для выходных потоков. Попробуйте 'fflush (stdout)'. –

+1

Почему вы используете как потоки C++ ('cin',' cout'), так и потоки стилей C ('FILE *')? * Не пересекайте потоки. * Используйте файлы 'std :: ifstream' для файлов. –

ответ

1

Из любопытства, есть причина для C функции? Делая какие-нибудь подобное в C++ будет лучше подходит для потоков с использованием, например:

#include <iostream> 
#include <fstream> 

using namespace std; 

void writeFile(const char *fileName) 
{ 
    ofstream writeToFile; 
    writeToFile.open(fileName); 
    if (!writeToFile.is_open()) { 
     cout << "Failed to open" << endl; 
     return; 
    } else { 
     string stringToWrite{""}; 
     char c = '\0';   
     cout << "Enter a text and end with dot (.): "; 
     while (c != '.') { 
      std::cin >> c; 
      stringToWrite += c; 
     } 
     writeToFile << stringToWrite << endl; 
     cout << "Written successfully" << endl; 
     writeToFile.close(); 
    } 
} 

int main() 
{ 
    const char *fileName="test.txt"; 
    writeFile(fileName); 
    return 0; 
} 

или, в качестве альтернативы:

#include <iostream> 
#include <fstream> 

using namespace std; 

void writeFile(const char *fileName) 
{ 
    ofstream writeToFile; 
    writeToFile.open(fileName); 
    if (!writeToFile.is_open()) { 
     cout << "Failed to open" << endl; 
     return; 
    } else { 
     string stringToWrite{""};  
     cout << "Enter text and press return: "; 
     getline(cin, stringToWrite); 
     writeToFile << stringToWrite << endl; 
     cout << "Written successfully" << endl; 
     writeToFile.close(); 
    } 
} 

int main() 
{ 
    const char *fileName="test.txt"; 
    writeFile(fileName); 
    return 0; 
} 
+0

?? определить «лучше подходит». –

+0

@KarolyHorvath Лучше писать идиоматический C++ для компилятора C++. –

+0

Компилятору все равно. * Люди * Делают (иногда). –

0

с 0 на первом проходе, следовательно, пустая строка.

изменить цикл в то время как к

while((c = getchar()) != EOF) 
    { 
     if(c == '.') 
     break; 
    } 

Это выглядит немного странно, но идиоматичен для чтения символов из потока в C.

+0

Umm Я только что добавил информацию о своем посте о различных IDE, дающих разные результаты. У меня проблема только на VisualStudio2015, и я попытался изменить мой цикл Why в качестве вашего предложения, но он все еще не работает. –

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