經過詳盡的谷歌搜索和訪問很多論壇,我還沒有找到一個很好的綜合答案這個問題。很多論壇建議使用獲取線 istream& getline (char* s, streamsize n)
函數。我的問題是如果我不知道每條線的長度是多少,並且無法預測可能的尺寸是多少?在C中它又是什麼?如何從c/C++中的文本文件讀取一行?
c/C++中是否有任何特定的函數每次從文本文件讀取一行?
解釋,使用代碼片段將幫助我很多。
經過詳盡的谷歌搜索和訪問很多論壇,我還沒有找到一個很好的綜合答案這個問題。很多論壇建議使用獲取線 istream& getline (char* s, streamsize n)
函數。我的問題是如果我不知道每條線的長度是多少,並且無法預測可能的尺寸是多少?在C中它又是什麼?如何從c/C++中的文本文件讀取一行?
c/C++中是否有任何特定的函數每次從文本文件讀取一行?
解釋,使用代碼片段將幫助我很多。
在c中,你可以使用fopen和getch。通常,如果您不能確切確定最長行的長度,您可以分配一個大緩衝區(例如8kb),並幾乎可以保證獲取所有行。
如果有機會,你可能真的很長,你必須逐行處理,你可以malloc一個合理的緩衝區,並使用realloc每次你接近填充它的大小加倍。
#include <stdio.h>
#include <stdlib.h>
void handle_line(char *line) {
printf("%s", line);
}
int main(int argc, char *argv[]) {
int size = 1024, pos;
int c;
char *buffer = (char *)malloc(size);
FILE *f = fopen("myfile.txt", "r");
if(f) {
do { // read all lines in file
pos = 0;
do{ // read one line
c = fgetc(f);
if(c != EOF) buffer[pos++] = (char)c;
if(pos >= size - 1) { // increase buffer length - leave room for 0
size *=2;
buffer = (char*)realloc(buffer, size);
}
}while(c != EOF && c != '\n');
buffer[pos] = 0;
// line is now in buffer
handle_line(buffer);
} while(c != EOF);
fclose(f);
}
free(buffer);
return 0;
}
getline()
是你在找什麼。您在C++中使用字符串,並且您不需要提前知道大小。
假設STD命名空間:
ifstream file1("myfile.txt");
string stuff;
while (getline(file1, stuff, '\n')) {
cout << stuff << endl;
}
file1.close();
注意:你需要'std :: getline(std :: istream&,std :: string&)'而不是'std :: istream :: getline'。 – 2010-06-20 23:25:37
我們如何在C中做到這一點? – 2010-06-20 23:30:29
在C++中,你可以使用全局函數的std ::函數getline,它需要一個字符串和流和一個可選的分隔符,讀取1號線,直到達到指定的分隔。舉例:
#include <string>
#include <iostream>
#include <fstream>
int main() {
std::ifstream input("filename.txt");
std::string line;
while(std::getline(input, line)) {
std::cout<<line<<'\n';
}
return 0;
}
該程序從文件讀取每一行並將其回顯到控制檯。
對於C你可能正在尋找使用fgets
,它已經有一段時間,因爲我用C,這意味着我有點生疏,但我相信你可以用它來模擬上述C++程序的功能,如所以:
#include <stdio.h>
int main() {
char line[1024];
FILE *fp = fopen("filename.txt","r");
//Checks if file is empty
if(fp == NULL) {
return 1;
}
while(fgets(line,1024,fp)) {
printf("%s\n",line);
}
return 0;
}
由於限制條件不能超過您正在讀取的緩衝區的最大長度。
謝謝。我們如何在C中做同樣的事情?任何的? – 2010-06-20 23:30:55
更新了我的帖子,回憶了我的做法,我希望它是正確的,否則我會糾正帖子,一旦人們指出我做錯了什麼。 – Jacob 2010-06-20 23:38:46
謝謝,我想知道是否有比使用固定長度的緩衝區更好的方法。我想我現在知道我們需要硬編碼緩衝區大小。 – 2010-06-20 23:40:26
在C中,fgets(),並且您需要知道最大大小以防止截斷。
這是C的最佳答案,它應該有更多upvotes。 (實際上'getline'更好,但非標準。) – 2015-01-25 18:33:51
我不是真的那麼好,在C,但我相信這代碼應該給你完整的單行至死不渝......
#include<stdio.h>
int main()
{
char line[1024];
FILE *f=fopen("filename.txt","r");
fscanf(*f,"%[^\n]",line);
printf("%s",line);
}
你應該避免'fscanf',因爲它會導致緩衝區溢出。它現在提供了將輸入大小限制爲正在寫入的緩衝區大小的方法(這裏是'line')。 – 2015-01-25 18:28:08
這不是一個DUP,因爲它特別要求關於C ,而假設的'dup'具體是在問C++。 – sje397 2013-06-01 00:55:43
@sje這個問題也說C++也... – 2013-06-01 01:10:28
@DannyBeckett是的,我注意到了。我認爲這與我的觀點不相關,因爲這個(不像其他人)詢問C,這使得它在質量上有所不同。 – sje397 2013-06-02 07:50:51