好的,所以我有一个巨大的文件,我想在1章中一次阅读。
章节由'$'
分隔。
我还没有真正熟悉C ++,所以我在C / C ++中创建了一些可以读到的内容。
#include <nds.h>
#include <stdio.h>
#include <string>
#include <vector>
#include <sstream>
int dataFileLoc = 7;
std::string fileReader(){
FILE * dataFile;
std::string chapterBuffer = "";
const int buffersize = 1024;
char charBuffer[buffersize];
bool foundEnd = false;
dataFile = fopen("xc3_.tsc", "rt");//open data file
fseek(dataFile,dataFileLoc,SEEK_SET);
while(!foundEnd){
fread(charBuffer,1,buffersize,dataFile);
for(int i=1; i<buffersize; i++){
if(charBuffer[i] == '$'){
foundEnd = true;
charBuffer[i] = '\0';
dataFileLoc = ftell(dataFile)-(buffersize-i);
break;//break to spare some time
}
}
chapterBuffer.append(charBuffer);
}
fclose(dataFile);//done with the file for now.
checkerTemp(chapterBuffer);
return chapterBuffer;
}
结果应该没问题。我还没有达到文件结尾。所以它可能会在那里失败。 然而,它看起来似乎是随机的(一致的,但在看似随机的位置)。 失败将导致在字符串中注入垃圾数据(如8个字符值),然后再次显示正常数据。
有没有人知道可能导致这种情况的原因,或者有没有人有更多的C ++方法来做到这一点?用字符串阅读器做什么?
提前致谢,
-Smileynator
答案 0 :(得分:3)
您正在使用C文件API,您应该使用C ++ iostream API。
要阅读章节,您应该使用std::getline
和'$'
作为分隔符参数。这意味着您不必担心缓冲区分配,因为字符串对象会自动分配它。
循环也变得非常简单。
while(std::getline(strm, str, '$').good())
do_something_with_chapter(str);
答案 1 :(得分:2)
一个错误是,如果你的while循环,循环,然后语句
chapterBuffer.append(charBuffer);
将尝试将一个NOT终止的字符缓冲区附加到chapterBuffer中 - 这不是一件好事。无论你是否找到'$',你都必须在for循环内维持;如果你没有那么你将不得不终止charBuffer;或者你可以为charBuffer分配buffersize + 1个字节,并在循环之前设置charBuffer [buffersize] ='\ 0';