在下面的代码中,我正在做以下事情:
但是我收到了这个错误,
./my_script: line 9: 27310 Segmentation fault ./a.out
我没有得到它在代码中做错的地方....
char *read_quoted_string(char outbuff[], FILE *fp){
char *buffer[1000];
int ch;
int i;
int counter=0;
int increment=0;
int prev=ftell(fp);
fseek(fp, 0L, SEEK_END);
int lengthOfFile=ftell(fp);
fseek(fp,prev,SEEK_SET);
fprintf(stdout,"%d",lengthOfFile);
while(lengthOfFile>0){
while(EOF!=(ch=fgetc(fp)))
if(ch == '"') break;
for(i=0;EOF!=(ch=fgetc(fp));++i)
{
if(ch == '"') break;
outbuff[i] = ch;
}
outbuff[i]='\0';
///////////////////////////////////////
char filename3[] = "NewData.txt";
FILE *file3 = fopen ( filename3, "w" );
if(file3!=NULL){
while(EOF!=(ch=fgetc(fp)))
fputc(ch,file3);
}
fclose(file3);
buffer[increment]=outbuff;
increment=increment+1;
fp=file3;
prev=ftell(fp);
fseek(fp, 0L, SEEK_END);
lengthOfFile=ftell(fp);
fseek(fp,prev,SEEK_SET);
}
return buffer[increment];
}
答案 0 :(得分:2)
如何使用SEEK_END转到文件的末尾 然后使用循环从该位置读取。 首先需要将光标重新设置到起始位置,然后循环文件。
答案 1 :(得分:0)
你能使用C ++(特别是C ++ 11)吗?如果是,您应该使用std::regex_search
而不是在C中重新实现某些内容。
std::string s ("blablabla \"bla bla\" bla \"bla \"");
std::smatch m;
std::regex e ("\"([^\"]*)");
while (std::regex_search (s,m,e)) {
for (auto x:m) std::cout << x << " ";
std::cout << std::endl;
}
答案 2 :(得分:0)
除非我遗漏了某些内容,否则以下代码不正确。
while(EOF!=(ch=fgetc(fp)))
if(ch == '"') break;
for(i=0;EOF!=(ch=fgetc(fp));++i)
{
if(ch == '"') break;
outbuff[i] = ch;
}
首先循环直到文件结束OR''。一旦你离开了这个循环你再次使用fgetc从同一个指针读取?
我相信您需要将指针重置为文件的开头,或者您可以完全删除while循环。我没有看到任何有用的东西。
答案 3 :(得分:0)
也许,像这样翻拍
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(void){
FILE *in, *out;
char *buffer[1000];
int increment = 0;
if(NULL!=(in =fopen("data.txt", "r"))){
if(NULL!=(out=fopen("NewData.txt", "w"))){
char buff[1000];
int i=0, ch, in_str = 0;
while(EOF!=(ch=fgetc(in))){
switch(ch){
case '"':
if(in_str){
buff[i] = '\0';
buffer[increment++] = strdup(buff);
i=0;//reset
if(increment == 1000){
fprintf(stderr, "Size of the buffer is insufficient!");
fclose(in);fclose(out);
return -1;
}
}
in_str = !in_str;
break;
default:
if(in_str){
buff[i++]=ch;
} else {
fputc(ch, out);
}
}
}
fclose(out);
}
fclose(in);
}
{
int i;
for(i=0;i<increment;++i)
printf("%s\n", buffer[i]);
//dealloc
for(i=0;i<increment;++i)
free(buffer[i]);
}
return 0;
}