我正在尝试读取txt文件的整个包含,而不是逐行,但整个包含
并将其打印在xcode文本域内的屏幕上
我正在使用obj-c和c ++ lang的混合:
while(fgets(buff, sizeof(buff), in)!=NULL){
cout << buff; // this print the whole output in the console
NSString * string = [ NSString stringWithUTF8String:buff ] ;
[Data setStringValue:string]; // but this line only print last line inside the textfield instead of printing it all
}
我正在尝试打印文件的整个包含:
但是它只是将最后一行打印到文本字段,请帮助我
答案 0 :(得分:2)
您是否有理由不使用Obj-C来读取文件?它将如此简单:
NSData *d = [NSData dataWithContentsOfFile:filename];
NSString *s = [[[NSString alloc] initWithData:d encoding:NSUTF8StringEncoding] autorelease];
[Data setStringValue:s];
编辑:要使用现在的代码,我会尝试这样的事情:
while(fgets(buff, sizeof(buff), in)!=NULL){
NSMutableString *s = [[Data stringValue] mutableCopy];
[s appendString:[NSString stringWithUTF8String:buff]];
[Data setStringValue:s];
}
答案 1 :(得分:1)
读取文件,将内容作为C ++字符串返回:
// open the file
std::ifstream is;
is.open(fn.c_str(), std::ios::binary);
// put the content in a C++ string
std::string str((std::istreambuf_iterator<char>(is)),
std::istreambuf_iterator<char>());
在您的代码中,您使用的是C api(来自cstdio的FILE*
)。在C中,代码更复杂:
char * buffer = 0; // to be filled with the entire content of the file
long length;
FILE * f = fopen (filename, "rb");
if (f) // if the file was correctly opened
{
fseek (f, 0, SEEK_END); // seek to the end
length = ftell (f); // get the length of the file
fseek (f, 0, SEEK_SET); // seek back to the beginning
buffer = malloc (length); // allocate a buffer of the correct size
if (buffer) // if allocation succeed
{
fread (buffer, 1, length, f); // read 'length' octets
}
fclose (f); // close the file
}
答案 2 :(得分:0)
要回答为什么您的解决方案不起作用的问题:
[Data setStringValue:string]; // but this line only print last line inside the textfield instead of printing it all
假设Data
引用文本字段,setStringValue:
将使用您传入的字符串替换字段的全部内容。您的循环一次读取并设置一行,因此在任何给定时时间,string
是文件中的一行。
只有当你在主线程上没有做任何其他操作时,才会告诉显示视图,所以你的循环 - 假设你没有在另一个线程或队列上运行它 - 不会一次打印一行。您读取每一行并用该行替换文本字段的内容,因此当您的循环结束时,该字段留下您将stringValue
设置为文件的最后一行的最后一行。
立即整理整个文件会有效,但仍存在一些问题:
一个合适的解决方案是:
for
或while
循环中读取。使用NSFileHandle或dispatch_source
,其中任何一个都会在读取文件的另一个块时调用您提供的块。