2017-06-04 154 views
0

首先,我不知道我的问题是否已经提出,但是我搜索了很多内容,但没有找到针对此问题的直接答案。 我想创建一个程序来读取其中有换行\n的字符串,并将内容写回到SD卡上的文本文件中,并使用fprintf()函数。我的编译器是ARM_GCC和我使用的只有fprintf()fwrite()写串特定库,所以我更愿意只使用这些功能,但如果你认为还有另一种途径,如果你这么说我将不胜感激。 我可以很容易地使用这个程序写一个字符串到文件:使用换行符将文本文件写入文本文件C++

void sd_open(string sd_value) 
{ 
    printf("Writing to Sd card..."); 
    FILE* fd = fopen("/sd/numbers.txt", "w+"); 
    fprintf(fd, "%s",sd_value.c_str()); 
    fclose(fd); 
    printf("writed this value to sd: %s\r\n", sd_value.c_str()); 
    printf("Done\n"); 
} 

问题是这样的代码写的sd_value的值只有一条线,我因子评分关于使用一个for循环中要搜索的字符串换行和一行一行地写入一个文件,但我不知道如何实现。 谢谢。

编辑... 假设sd_value是这样的:

string sd_value="Hello\nWelcome\nBye" 

必须被存储为下面的文本文件:

Hello 
Welcome 
Bye 

其实,sd_value不处理我的程序和用户在另一个应用程序中键入一个值,并以字符串形式接收它。我可以告诉用户在他的文本框中使用\ n来输入换行符,但不知道如何在代码中将它作为换行符对待。

+0

所以你的意思是'sd_value'可能已经包含了''\ n ''字符,并且你不想存储单行来达到这些区域,在每个'\ n''之前加上'\ r'字符? –

+0

鉴于此,从您的代码判断,您似乎知道如何将使用'printf'打印到控制台的字符串添加,这让我感到有些困惑,因为您需要询问在打印时如何执行相同的操作一个使用'fprintf'的文件 - 提示:机制是一样的。 – tofro

+0

感谢您的回答。我只想将相同的确切字符串打印到文本文件,但无论我的字符串是否包含“\ n”,它只打印在一行中,并且我不知道如何将添加到“printf”。你能帮助一点清楚吗? –

回答

0

最后,我写了一个程序做我想要的,我不知道我是否可以改善它是什么,但它的工作原理:

void sd_open(string sd_value) 
{ 
    string str2; 
    char *y; 
    string sub="\\n"; // str2 is string to search, sub is the substring to search for 
    vector<size_t> positions; // holds all the positions that sub occurs within str 
    size_t pos = sd_value.find(sub, 0); 
    while(pos != string::npos) { 
    positions.push_back(pos); 
    pos = sd_value.find(sub,pos+1); 
    } 
    for(int i=0; i<positions.size(); ++i) { 
    printf("list the posistions %d\n",positions[i]); 
    } 
    printf("Writing to SD card...\n"); 
    FILE* fd = fopen("/sd/mydir/out.txt", "w+"); 
    errno_error(fd); 
    for(int i=0; i<=positions.size(); i++) { 
    if(i==0) { 
     str2= sd_value.substr(0,positions[i]); 
    } else if (i==positions.size()) { 
     str2= sd_value.substr(positions[i-1]+2,sd_value.size()); 
    } else { 
     str2= sd_value.substr(positions[i-1]+2,positions[i]-(positions[i-1]+2)); 
    } 
    y=new char[str2.length() + 1]; 
    strcpy(y, str2.c_str()); 
    printf("here is the %d line: ",i); 
    printf("%s\n",y); 
    fprintf(fd, "%s\n", y); 
    } 
    fclose(fd); 
    delete[] y; 
    printf("Done"); 
} 
1

有很多简单的方法做你想要什么,但我真的需要例如输入是如何拍摄(sd_value) 你所说的这个字符串sd_value包含手段:您好,欢迎光临BYE .... ,绝不做换行符

答案如果像什么,我想:

每次读一个字符串

*sd_value += "\n";* 

如果你有很多行程序结束它,使用stringstreamç应该更有效率。

ostringstream lines; 

lines << "Line 1" << endl; 
lines << "Line 2" << endl; 

cout << lines.str(); // .str() is a string 
+0

谢谢,但我认为如何抓住'sd_value'并不重要,它可以是“Hello \ n World”,它必须分别在2行中写入“Hello”和“World”。 –

+0

我添加了一些更多的信息给我的话题。 –

+0

#include std :: vector strs; boost :: split(strs,sd_value,boost :: is_any_of(“\ n”)); -------------- 这将拆分字符串\ n找到并添加到该向量,然后您可以使循环打印文件中的向量 尝试它并告诉我 –

1

有哪个符号(一个或多个)被选择用于EOL(结束线)中,e操作系统之间的差异。 G。

  • 的Windows:\r\n
  • 的Linux:\n
  • 的MacOS:\r

这意味着,如果你在你有sd_value从一个操作系统(例如MacOS的)和EOL符号,你会使用命令

fprintf(fd, "%s",sd_value.c_str()); 

在其他操作系统(例如, G。Windows),在目标操作系统中可能不会将此EOL符号解释为EOL,并且您的整个字符串将被写入一行。

+0

我认为问题是在我的应用程序文本框中,当我使用\ r \ n它被视为4字符而不是'EOF'时,我如何让我的程序将这4个字符当作EOF并插入一个新行? –

+0

你的意思是'EOL'(行尾),* not *'EOF'(文件结束)。 –

+0

@JesperJuhl - 是的,EOL,谢谢,我会在我的回答中纠正它。 – MarianD