C-如何使用read()存储一个单词



关于程序:您好,我正在编写一个简单的程序来从.txt文件中提取内容,然后将该内容转换为.csv文件。该计划是在该.txt文件中查找特定单词。这实际上只是在linux上的c中的cont(),write(),write()和clote()

中的clote(), 上的clote()

问题:在代码的第34行上,我尝试存储每个字符形成一个单词。从.txt提取"后,它将清除单词缓冲区。问题是,我得到了一个分段故障(核心转储)。我不确定如何解决此问题。我尝试使用GDB进行调试并在第34行中找到SEG故障。

预先感谢您

代码

/* 
Program to convert content inside a .txt file 
into a .csv file.
*/
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>      // open()
#include <unistd.h>     // For read(), write() an close()
#include <string.h>     // Used for strcmp()
int main(int argc, char **argv){
    int samp = open("sample.txt", O_RDONLY);        // This is Opening a file to work with. @param char  *filename,  @param int  access,  @param int  permission
    int csv = open("sample.csv", O_WRONLY | O_CREAT, 0600);     // Used to create a file. 
    char *word;         // Stores each word 
    char buff[1];       // Holds 1 character of the file
    int i = 0;          // Counter for word buffer
    /* read(handle (file), buffer, size (bytes)) */
    /* write(handle (file), buffer, size (bytes)) */
    while(read(samp, buff, 1) != 0){    // Loops through file, char by char 
        printf("%s", buff);             // prints current character in buff
        if(strcmp(buff," ") == 0){      // To create csv, every " " found, we add a "," 
            write(csv, ",", 1);         // If " " is found, we write a comma to csv file
            word = "";                  // Clear word buffer
        }
        else{
            write(csv, buff, 1);        // Write value of buff in csv file
            word[i] = buff[0];              // Copy each characer in buff to word
        }
        i++;
    }
    close(samp);    // Closig .txt file
    close(csv);     // Closing .csv file
    return 0;
}

问题是

 printf("%s", buff);

buff不是 string 。您可以

  • buff定义为两个元素数组,char buff[2] = {0};,然后将buff用作A String
  • buff定义为单个char(不是数组),将&buff传递给read()并使用%c格式指定器以打印buff
  • 使用%c并通过buff[0]

为了详细说明,%s格式指定器将一个参数作为指向null终止的char数组的指针。在您的情况下,buff是一个元素太短,无法容纳输入(来自read())以及空末端。因此,由于%s的属性,发生了限制的访问,从而调用了未定义的行为。

我认为您遇到的问题的一个是您正在编写word[i] = buff[0],但是word仅指向字符串常数,如果有的话(""),这些是您应该而不是写入)。您需要创建一个可写的缓冲区来存储单词。

我也看不到您曾经将i重置为0,当您完成一个单词时,它将永远试图附加到同一位置。

要解决这个问题,您可以尝试以下更改:

char *word;-> char word[256]; /* NOTE: arbitrary max word size here, you will need to ensure that you don't overrun that */

word = "";-> word[i] = ''; i = 0;/*重置字符串 */

edit :另外,使用strcmp比较单个字符在此处被损坏,因为它不是null终止字符串。相反,只做if(buff[0] == ' ')

之类的事情

NOTE :我看不到您尝试组装的word缓冲区有用,您可能只能完全切碎它。

相关内容

  • 没有找到相关文章

最新更新