繁体   English   中英

C ++读取文本文件,直到特定的分隔符

[英]C++ read text file until specific delimiter

好的,我有一个巨大的文件,想一次在第一章中阅读。 一章以'$'分隔。 我还不是很熟悉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

您正在使用C文件API,应该使用C ++ iostream API。

要阅读一章,您应该使用带有'$' std::getline作为分隔符参数。 这意味着您不必担心缓冲区分配,因为字符串对象会自动分配缓冲区。

循环也变得非常简单。

while(std::getline(strm, str, '$').good())
    do_something_with_chapter(str);

一个错误是,如果您的while循环循环,则该语句

chapterBuffer.append(charBuffer);

将尝试将未终止的字符缓冲区追加到ChapterBuffer中-这不是一件好事。 无论是否找到“ $”,您都必须在for循环中进行维护; 如果没有,则必须终止charBuffer; 或者,您可以为charBuffer分配buffersize +1个字节,并在循环之前设置charBuffer [buffersize] ='\\ 0';

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM