2014-10-28 40 views
0

我已经在这里好几个小时了,我觉得我没有在C中获得一些基本的技术。我一直试图读取一个特定的行,并将其存储到一个文件的2个单独的文件中。源文件(temp)是我正在阅读的文件,2个文件,数据和文本是我试图存储的2个文件。如何将文件的特定内容复制到C中的另一个文件中?

TL; DR,如何将文件中的内容拆分为两个单独的文件?

例如,输入文件是:

.data 
A: .word 32 
B: .word 16 

.text 
main: 
la $s0 A 
lw $s0 0($s0) 
la $s1 B 
lw $s1 0($s1) 

该功能将在临时文件和处理。数据和的.text段为独立的文件。

void process_file(FILE * temp) 
{ 
    FILE * data, * text; 

    char * token; 
    char * nextLine; 
    char line[256]; 
    char * str_token = malloc(256 * sizeof(char)); 
    char * str = malloc(256 * sizeof(char)); 

    int i; 

    data = fopen("data.asm", "w"); 
    text = fopen("text.asm", "w"); 

    if (temp == NULL || data == NULL || text == NULL) 
    { 
     printf("UNABLE TO OPEN OR LOCATE FILES. EXITING.\n"); 
     exit(1); 
    } 

    while (!feof(temp)) 
    { 
     if ((nextLine = fgets(line, 256, temp)) != NULL) 
     { 
      token = strtok(nextLine, "\n"); 
      //printf("%s", nextLine); 

      if (token != NULL) 
      { 
       strcat(str_token, token); 
       token = strtok(NULL, "\n"); 

       if ((strstr(str_token, ".data")) != NULL) 
       { 
        strcat(str, str_token); 
        fprintf(data, "%s", str); //ADDING THIS CAUSES A SEG FAULT :(
       } 
       else if ((strstr(token, ".text")) != NULL) 
       { 
        fprintf(text, "%s", token); 
        token = strtok(NULL, "\n"); 
       } 
      } 
     } 
    } 
} 

谢谢!

+2

它看起来像你继续追加'str'和'str_token'而不需要清除它们。我猜你最终会忘记分配内存的末尾。你只是试图从.data中写出每行,直到你将.text行打到一个文件,其余的打到另一个文件?目前尚不清楚所有strtok的东西是什么。 – 2014-10-29 00:05:09

+1

使用'strlcat()'而不是'strcat()'。这样更安全,并且可以帮助您避免将来出现这样的问题。 – 2014-10-29 00:08:30

+0

您是否遇到了错误或路由输出? – davidc 2014-10-29 00:12:29

回答

1
void process_file(FILE *temp){ 
    FILE *data, *text, *fp; 
    char line[256], str[256]; 
    char *token; 

    data = fopen("data.asm", "w"); 
    text = fopen("text.asm", "w"); 

    if (temp == NULL || data == NULL || text == NULL) { 
     printf("UNABLE TO OPEN OR LOCATE FILES. EXITING.\n"); 
     exit(1); 
    } 
    fp = data;//default for not start with .data and .text 
    while(fgets(line, sizeof line, temp)){ 
     strcpy(str, line); 
     if((token=strtok(str, " \t\n"))!=NULL){//not blank line 
      if(strcmp(token, ".data")==0) 
       fp = data; 
      else if(strcmp(token, ".text")==0) 
       fp = text; 
     } 
     fprintf(fp, "%s", line); 
    } 
    fclose(data); 
    fclose(text); 
} 
+0

这个修好了!非常感谢! :) – user3171597 2014-10-29 01:17:56

0

这是我用来获取你的答案,你使用反正

void process_file(FILE * temp) 
{ 
    //You may use NULL versus 0 
    FILE * data = 0, * text = 0; 

    char * token = 0; 
    char * nextLine = 0; 
    char line[256]; 

    int i = 0; 

    data = fopen("data.asm", "w"); 
    text = fopen("text.asm", "w"); 

    if (0 == temp || 0 == data || 0 == text) 
    { 
     printf("UNABLE TO OPEN OR LOCATE FILES. EXITING.\n"); 
     exit(1); 
    } 

    while (!feof(temp)) 
    { 
     if ((nextLine = fgets(line, 256, temp)) != NULL) 
     { 
      token = strtok(nextLine, "\n"); 
      //printf("%s", nextLine); 

      if (0 != token){ 
       if(strcmp(token, ".data") == 0){ 
       //Make use of that i 
       i = 1; 
      } 
      else if(strcmp(token, ".text") == 0){ 
       i = 2; 
      } 
      switch(i){ 
       case 1: 
        fprintf(data, "%s\r\n", token); 
        break; 
       case 2: 
        fprintf(text, "%s\r\n", token); 
        break; 
       default: 
        printf("Invalid!"); 
        break; 
       } 
      } 
     } 
    } 
fclose(data); 
fclose(text); 
fclose(temp); 

提供的代码}

0
#include <string.h> 
#include <stdio.h> 
void process_file(FILE * temp) 
{ 
FILE * data, * text, *write = NULL; 

char * token; 
char * nextLine; 
char line[256]; 
char * str_token = malloc(256 * sizeof(char)); 
char * str = malloc(256 * sizeof(char)); 

char val [] = "safasfsdf"; 
int i; 
data = fopen("data.asm", "w"); 
text = fopen("text.asm", "w"); 


if (temp == NULL || data == NULL || text == NULL) 
{ 
    printf("UNABLE TO OPEN OR LOCATE FILES. EXITING.\n"); 
    exit(1); 
} 

while (!feof(temp)) 
{ 
    if ((nextLine = fgets(line, 256, temp)) != NULL) 
    { 

    if ((strstr(line, ".data")) != NULL) 
    { 
     write = data; 
    } 
    else if ((strstr(line, ".text")) != NULL) 
    { 
     write = text; 
    } 

    if(line[0]!= '\n'){ 
     printf ("%p %s",write, line); 
      fprintf(write, "%s", line); 
    } 
    } 
} 


fclose (data); 
fclose (text); 

} 

模式被首次发现。基于模式文件指针被选中。我已经从原始源中删除了一些不需要的行,并使其变得简单。希望这会对你有所帮助。