关于程序:您好,我正在编写一个简单的程序来从.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
缓冲区有用,您可能只能完全切碎它。