我使用getchar()和循环来获取文本并使用fputc()放入文本文件中,但写入后它总是在文本文件中留空第一行。当字符输入为点(。)时,循环停止。如何删除第一行?
更新(2016年12月29日):我使用了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);
}
}
答案 0 :(得分:1)
出于好奇,有没有C功能的原因?在C ++中做这样的事情更适合使用流,比如:
library(data.table)
setDT(df)
df[, lapply(.SD, function(x) length(unique((x * Species)[!is.na(x)]))),
.SDcols=X1983:X2013, by=lot]
lot X1983 X1988 X2003 X2008 X2013
1: 1 1 2 2 2 2
2: 2 2 2 2 1 1
3: 3 2 2 2 2 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{""};
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;
}
答案 1 :(得分:0)
第一遍c为0,因此为空行。
将while循环更改为
while( (c = getchar()) != EOF)
{
if(c == '.')
break;
}
看起来有点奇怪,但在C语言中从流中读取字符是惯用的。