[英]taking input from a file
我有以下名為asmfile.txt的文件
copy start 1000
read ldx zero
rd indev
rloop tix k100
為了從此文件中進行逐行輸入,我編寫了以下代碼。
void aviasm::crsymtab()
{
ifstream in(asmfile,ios::in);//opening the asmfile
in.seekg(0,ios::beg);
char c;
string str[3];
string subset;
long locctr=0;
int i=0;
while((c=in.get())!=EOF)
{
in.putback(c);
str[0]="";
str[1]="";
str[2]="";
while((c=in.get())!='\n')
{
in.putback(c);
in>>str[i];
i==2?i=0:i++; //limiting i to 2....
}
cout<<str[0]<<" "<<str[1]<<" "<<str[2]<<endl;
}
in.close();
}
//現在的問題是前三行已成功輸入到str ...但是最后一行未輸入到str ....我知道這是因為在控制台上運行程序時我看到了...
copy start 1000
read ldx zero
rd indev
'rd indev'的縮進更改是因為str [0] =“ rd”和str [1] =“ indev” ..... plz告訴我為什么第四行沒有輸入到str ....
我不知道逐個字符讀取文件並將其放回流中的目的是什么。 線
string str[3];
定義字符串str[0]
到str[2]
。 寫入不存在的str[3]
是未定義的行為。 一種更清潔的方法是
std::ifstream in(asmfile);
std::vector<std::string> lines;
std::string line;
while (std::getline(in, line))
{
lines.push_back(line);
}
然后, lines.size()
給出成功讀取的行數。
for (size_t i = 0; i < lines.size(); ++i)
{
std::cout << i << " : " << lines[i] << '\n';
}
至於代碼為什么失敗: while((c=in.get())!='\\n')
的最后一行中沒有換行符時, while((c=in.get())!='\\n')
進入無限循環。
更改i==2?i=0:i++;
到i ++並移動int i=0;
在while循環中,編輯asmfile,以使它在最后一行后面有一個換行符,您的代碼將起作用。
就是說,您真的應該像Rene建議的那樣去做。 像這樣的代碼很亂而且容易出錯。
我無法調試代碼,因為我不明白你的意圖-什么是成交與get()
和pushback()
調用? 因此,讓我重寫您的代碼,而不是回答您的緊迫問題:
#include <string>
#include <sstream>
#include <iostream>
#include <fstream>
const char * asmfile("/tmp/asm.txt");
void crsymtab()
{
std::ifstream in(asmfile); // opening the asmfile
std::string line;
while(std::getline(in, line)) {
std::istringstream sline(line);
std::string str[3];
if(sline.peek() == ' ')
sline >> str[1] >> str[2];
else
sline >> str[0] >> str[1] >> str[2];
std::cout << str[0] << " " << str[1] << " " << str[2] << "\n";
}
}
int main() { crsymtab(); }
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.