我需要在C ++中创建一个必须逐行读取和写入特定格式文本文件的程序,但问题是在我的PC中我在Windows中工作,而在大学里他们有Linux而我遇到了问题因为这些操作系统中的行结尾不同。
我是C ++的新手,不知道我是否可以让我的程序能够读取文件,无论它们是用Linux还是Windows编写的。谁能给我一些提示?谢谢!
输入如下:
James White 34 45.5 10 black
Miguel Chavez 29 48.7 9 red
David McGuire 31 45.8 10 blue
每一行都是6个变量结构的记录。
答案 0 :(得分:2)
在没有最后一个(即分隔符)参数的情况下使用std::getline
重载应该自动处理行尾转换:
std::ifstream in("TheFile.txt");
std::string line;
while (std::getline(in, line)) {
// Do something with 'line'.
}
答案 1 :(得分:1)
这是一种删除额外“\ r”字符串的简单方法:
std::ifstream in("TheFile.txt");
std::string line;
std::getline(input, line));
if (line[line.size() - 1] == '\r')
line.resize(line.size() - 1);
答案 2 :(得分:0)
由于结果将是CR LF,我会添加如下内容以消耗附加内容(如果存在)。所以,一旦你读完你就记录了这个,然后再尝试阅读下一个。
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
答案 3 :(得分:0)
如果您已经可以阅读这些文件,只需检查所有换行符,例如"\n"
和"\r"
。我很确定linux使用"\r\n"
作为换行符。
您可以阅读此页面:http://en.wikipedia.org/wiki/Newline
以下是所有ascii代码的列表,包括换行符:
编辑:Linux使用"\n"
,Windows使用"\r\n"
,Mac使用"\r"
。感谢Seth Carnegie
答案 4 :(得分:0)
如果您知道要为每条记录阅读的值的数量,您只需使用“&gt;&gt;”方法。例如:
fstream f("input.txt" std::ios::in);
string tempStr;
double tempVal;
for (number of records) {
// read the first name
f >> tempStr;
// read the last name
f >> tempStr;
// read the number
f >> tempVal;
// and so on.
}
应该不够吗?
答案 5 :(得分:0)
您好,我会分阶段给您答案。请深入了解代码。
第1阶段:设计我们的计划: 我们基于要求的计划应该......:
通常您应该将代码拆分为代表上述内容的函数。
阶段2:创建所选结构的数组以保存数据
...
#define MAX 10
...
strPersonData sTextData[MAX];
...
第3阶段:允许用户同时提供文件位置及其名称:
.......
string sFileName;
cout << "Enter a file name: ";
getline(cin,sFileName);
ifstream inFile(sFileName.c_str(),ios::in);
.....
- &gt;第3阶段的注1。用户提供的接受格式应为:
c:\\SomeFolder\\someTextFile.txt
我们使用两个\反斜杠而不是一个\,因为我们希望它被视为文字反斜杠。
- &gt;第3阶段的注2。我们使用ifstream即输入文件流,因为我们想从文件中读取数据。这个 期望文件名为c-type字符串而不是c ++字符串。出于这个原因,我们使用:
..sFileName.c_str()..
第4阶段:阅读所选文件的所有数据:
...
while (!inFile.eof()) { //we loop while there is still data in the file to read
...
}
...
所以最后代码如下:
#include <iostream>
#include <fstream>
#include <cstring>
#define MAX 10
using namespace std;
int main()
{
string sFileName;
struct strPersonData {
char c1stName[25];
char c2ndName[30];
int iAge;
double dSomeData1; //i had no idea what the next 2 numbers represent in your code :D
int iSomeDate2;
char cColor[20]; //i dont remember the lenghts of the different colors.. :D
};
strPersonData sTextData[MAX];
cout << "Enter a file name: ";
getline(cin,sFileName);
ifstream inFile(sFileName.c_str(),ios::in);
int i=0;
while (!inFile.eof()) { //loop while there is still data in the file
inFile >>sTextData[i].c1stName>>sTextData[i].c2ndName>>sTextData[i].iAge
>>sTextData[i].dSomeData1>>sTextData[i].iSomeDate2>>sTextData[i].cColor;
++i;
}
inFile.close();
cout << "Reading the file finished. See it yourself: \n"<< endl;
for (int j=0;j<i;j++) {
cout<<sTextData[j].c1stName<<"\t"<<sTextData[j].c2ndName
<<"\t"<<sTextData[j].iAge<<"\t"<<sTextData[j].dSomeData1
<<"\t"<<sTextData[j].iSomeDate2<<"\t"<<sTextData[j].cColor<<endl;
}
return 0;
}
我现在要给你一些练习:D:D
1)在最后一个循环中:
for (int j=0;j<i;j++) {
cout<<sTextData[j].c1stName<<"\t"<<sTextData[j].c2ndName
<<"\t"<<sTextData[j].iAge<<"\t"<<sTextData[j].dSomeData1
<<"\t"<<sTextData[j].iSomeDate2<<"\t"<<sTextData[j].cColor<<endl;}
为什么我使用变量i代替MAX?
2)你可以改变基于第1阶段的程序,例如:
int main(){
function1()
function2()
...
functionX()
...return 0;
}
我希望我能帮助......