文件I/O-显示文件的内容
File I/O - Displaying contents of a file
我在为一个简单的TCP服务器寻找一些关于函数的建议。
第三个if
语句假设检查token[1]
是否是文件或目录的名称(工作正常)。我的问题是,打开文件,向客户端显示文件内容,然后关闭文件。我试着使用文件I/O调用,但没有办法做到这一点。如有任何建议,不胜感激。
void processClientRequest(int connSock) {
int received, count = 0;
char *token[] = { (char*)0, (char*)0 };
char path[257], buffer[257];
// read a message from the client
if ((received = read(connSock, path, 256)) < 0) {
perror("receive");
exit(EXIT_FAILURE);
}
path[received] = ' ';
cerr << "received: " << path << endl;
for(char *p = strtok(path, " "); p; p = strtok(NULL, " ")) //sets tokens
token[count++] = p;
if(strcmp(token[0], "GET") != 0) { //if the first "command" was not GET, exit
strcat(buffer, "Must start with GET");
write(connSock, buffer, strlen(buffer));
exit(-1);
}
int rs;
int fd, cnt;
struct stat bufferS;
rs = stat(token[1], &bufferS);
if (S_ISREG(bufferS.st_mode)) { //input was a file
fd = open(token[1], O_WRONLY); //open
cnt = read(fd, buffer, 257); //read
write(connSock, buffer, strlen(buffer));
}
// else, open directory and stuff (code for that has been omitted to save space)
cerr << "done with this clientn";
close(connSock);
}
如果只打开文件进行写入,则无法读取文件:
fd = open(token[1], O_WRONLY); //open
如果你不想写任何东西,你需要打开它进行阅读,在你的情况下为O_RDONLY(否则为O_RDWR)。
顺便说一句,你的缓冲区大小是奇数(257),通常情况下,一个缓冲区的分配是二次方(256)。
更新:
请注意,read不一定为null终止字符串!使用cnt而不是strlen(缓冲区)进行写入,但要检查它是否<0(错误)和==0(文件结尾)。如果您的文件可以具有任意大小(例如,可能大于缓冲区),您可能希望在循环中执行此操作。
相关文章:
- 如何从QFile阅读?它显示该文件不可访问
- Visual Studio C++ 它只构建选项卡中显示的文件吗?
- 使用 Cmake 在 Qt Creator 中显示头文件
- 在C Windows程序中显示文本文件内容
- 使用 C++ 中的向量在新行上显示文本文件中的列
- 如何使用 Opengl 库显示文本文件中的 3D 点
- 如何在 Xcode 项目导航器中显示.txt文件
- 如何配置MSVC以使用__FILE__显示头文件的相对路径
- 如何在twebbrowser组件中显示HTML文件
- 使QT/C 程序显示其文件类型,如Windows上已知
- C++程序无法正确显示文本文件中的内容
- 有没有办法选择通过标准的OPENFILE对话框向用户显示哪些文件
- 如何使用流显示任何文件中的特殊和隐藏字符
- C++:帮助存储和显示输入文件变量
- 无法在QTreeView中显示.mp3文件
- 我可以使用什么开源C 库在专有的封闭源应用程序中显示PDF文件
- 显示 txt 文件详细信息
- 在日食中突出显示生成文件
- 如何在行和列中显示矩阵文件
- 如何显示顺序文件的内容